Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Ich sehe immer wieder Leute, die Doubles in C# verwenden.Ich weiß, dass ich irgendwo gelesen habe, dass Verdoppelungen manchmal an Präzision verlieren.Meine Frage ist, wann sollte ein Double und wann ein Dezimaltyp verwendet werden?Welcher Typ eignet sich für Geldberechnungen?(d. h.mehr als 100 Millionen US-Dollar)

War es hilfreich?

Lösung

Für Geld, immer dezimal. Es ist, warum es erstellt wurde.

Wenn Zahlen müssen korrekt oder Balance addieren, verwenden dezimal. Dazu gehört alles finanzielle Lagerung oder Berechnungen, Partituren oder andere Zahlen, die Menschen mit der Hand tun könnten.

Wenn der genaue Wert der Zahlen nicht wichtig ist, verwenden Sie doppelte für die Geschwindigkeit. Dazu gehören Grafik, Physik oder andere Berechnungen Naturwissenschaften, wo es bereits eine „Anzahl der signifikanten Stellen“.

Andere Tipps

  

Meine Frage ist, wann sollte eine Anwendung ein   Doppel und wann sollte ich eine Dezimalzahl verwenden   Geben Sie?

decimal für, wenn Sie mit Werten im Bereich arbeiten von 10 ^ (+/- 28) und wo Sie die Erwartungen über das Verhalten haben, basierend auf der Basis 10 Darstellungen -. Im Grunde Geld

double für, wenn Sie benötigen relativ Genauigkeit (dh Präzision in den hinteren Ziffern auf große Werte zu verlieren, ist kein Problem) über völlig unterschiedliche Größen - double umfasst mehr als 10 ^ (+/- 300) . Wissenschaftliche Berechnungen sind das beste Beispiel hier.

  

, welcher Typ ist geeignet für Geld   Berechnungen?

dezimal, dezimal , dezimal

Nehmen Sie keine Ersatzstoffe.

Der wichtigste Faktor ist, dass double als Binärbruch umgesetzt wird, kann nicht genau viele decimal Fraktionen repräsentieren (wie 0,1) an alle und seine Gesamtstellenzahl ist kleiner, da es 64- Bit breit vs. 128-Bit für decimal. Schließlich Finanzanwendungen müssen oft bestimmte folgen Rundungsmodi (manchmal gesetzlich vorgeschrieben). decimal unterstützt diese ; double nicht.

System.Single / schweben - 7 Ziffern
System.Double / doppelt - 15-16 Ziffern
System.Decimal / Dezimal - 28-29 signifikante Ziffern

Die Art und Weise, wie mich die Verwendung des falschen Typs (vor ein paar Jahren) gestochen hat, ist bei großen Mengen:

  • 520.532,52 £ – 8 Ziffern
  • 1.323.523,12 £ – 9 Ziffern

Für einen Float sind Ihnen 1 Million ausgegangen.

Ein 15-stelliger Geldwert:

  • £1,234,567,890,123.45

9 Billionen mit einem Doppelten.Aber bei Divisionen und Vergleichen ist es komplizierter (ich bin definitiv kein Experte für Gleitkommazahlen und irrationale Zahlen – Siehe Marcs Standpunkt).Das Mischen von Dezimalzahlen und Doppelzahlen führt zu Problemen:

Eine mathematische oder Vergleichsoperation, bei der eine Gleitpunktzahl verwendet wird, liefert möglicherweise nicht dasselbe Ergebnis, wenn eine Dezimalzahl verwendet wird, da die Schwimmpunktzahl möglicherweise nicht genau der Dezimalzahl nimmt.

Wann sollte ich Double anstelle von Decimal verwenden? hat einige ähnliche und ausführlichere Antworten.

Benutzen double anstatt decimal für monetäre Anwendungen ist eine Mikrooptimierung – so sehe ich es am einfachsten.

Dezimal ist für genaue Werte. Double ist für Näherungswerte.

USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)

Für Geld: decimal. Es kostet ein wenig mehr Speicher, hat aber keine Runden Probleme wie double manchmal hat.

Auf jeden Fall verwenden Integer-Typen für Ihr Geld Berechnungen. Dies kann nicht genug betont werden, auf dem ersten Blick, da es scheint, dass ein Floating-Point-Typ geeignet ist.

Hier ist ein Beispiel in Python-Code:

>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0

sieht ziemlich normal.

Nun ist diese versuchen Sie es erneut mit 10 ^ 20 Zimbabwe Dollar

>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0

Wie Sie sehen können, verschwand der Dollar.

Wenn Sie den Integer-Typen verwenden, es funktioniert:

>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1

Ich denke, dass der Hauptunterschied neben Bitbreite ist, dass Dezimalexponenten Basis 10 hat und Doppel hat 2

http: // Software-produkt- development.blogspot.com/2008/07/net-double-vs-decimal.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top