Frage dezimal vs doppelt! - Welchen sollte ich verwenden und wann? [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich sehe immer wieder Leute, die Double in C # benutzen. Ich weiß, ich habe irgendwo gelesen, dass Doppelgänger manchmal die Präzision verlieren. Meine Frage ist wann sollte ein Double verwendet werden und wann sollte ich einen Dezimaltyp verwenden? Welcher Typ eignet sich für Geldberechnungen? (dh mehr als $ 100 Millionen)


756
2017-07-22 14:37


Ursprung


Antworten:


Für Geld, immer Dezimal. Deshalb wurde es geschaffen.

Wenn die Zahlen korrekt addiert werden müssen, oder das Guthaben, verwenden Sie die Dezimalzahl. Dies umfasst alle finanziellen Speicher oder Berechnungen, Punkte oder andere Zahlen, die Menschen von Hand tun könnten.

Wenn der genaue Wert der Zahlen nicht wichtig ist, verwenden Sie double für die Geschwindigkeit. Dies umfasst Grafik-, Physik- oder andere physikalische Naturwissenschaften Berechnungen, wo bereits eine "Anzahl von signifikanten Ziffern" vorhanden ist.


901
2017-07-22 14:42



Meine Frage ist wann sollte ein Gebrauch sein   doppelt und wann sollte ich eine Dezimalstelle verwenden   Art?

decimal wenn du mit Werten im Bereich von 10 ^ (+/- 28) arbeitest und wo du Erwartungen über das Verhalten basierend auf Basis-10-Darstellungen hast - im Grunde genommen Geld.

double für wenn Sie brauchen relativ Genauigkeit (d. h. Verlust der Genauigkeit in den hinteren Ziffern bei großen Werten ist kein Problem) über wild unterschiedliche Größen - double deckt mehr als 10 ^ (+/- 300) ab. Wissenschaftliche Berechnungen sind hier das beste Beispiel.

welcher Typ ist für Geld geeignet?   Berechnungen?

Dezimal, Dezimal, Dezimal

Akzeptiere keinen Ersatz.

Der wichtigste Faktor ist das double, die als binärer Bruch implementiert sind, können viele nicht genau darstellen decimal Brüche (wie 0,1) überhaupt und seine Gesamtzahl von Ziffern ist kleiner, da es 64 Bit breit gegenüber 128 Bit ist decimal. Schließlich müssen Finanzanwendungen oft spezifisch folgen Rundungsmodi (manchmal gesetzlich vorgeschrieben). decimal  unterstützt diese; double nicht.


157
2017-07-22 15:12



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

Die Art, wie ich gestochen wurde, indem ich den falschen Typ benutzte (vor ein paar Jahren), ist mit großen Mengen:

  • £ 520,532.52 - 8 Ziffern
  • £ 1.323.523,12 - 9 Ziffern

Du bist bei 1 Million für einen Float ausgelaufen.

Ein 15-stelliger Geldwert:

  • £ 1,234,567,890,123.45

9 Billionen mit einem Doppel. Aber mit Division und Vergleichen ist es komplizierter (ich bin definitiv kein Experte in Fließkomma und irrationalen Zahlen - Siehe Marcs Argument). Das Mischen von Dezimalzahlen und Doppeln verursacht Probleme:

Eine mathematische oder Vergleichsoperation   das verwendet eine Gleitkommazahl   möglicherweise nicht das gleiche Ergebnis, wenn a   Dezimalzahl wird verwendet, weil die   Floating-Point-Nummer möglicherweise nicht   genau die ungefähre Dezimalzahl   Nummer.

Wann sollte ich double anstelle von decimal verwenden?hat einige ähnliche und tiefere Antworten.

Verwenden double Anstatt von decimal  für monetäre Anwendungen ist eine Mikro-Optimierung - das ist die einfachste Art, wie ich es betrachte.


34
2018-02-04 12:06



Dezimal ist für genaue Werte. Double ist für ungefähre Werte.

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

32
2017-07-22 14:59



Für Geld: decimal. Es kostet etwas mehr Speicher, hat aber keine Rundungsprobleme double hat manchmal.


23
2017-07-22 14:39



Bestimmt Verwenden Sie Integer-Typen für Ihre Geldberechnungen. Dies kann nicht genug betont werden, da es auf den ersten Blick scheint, dass ein Gleitkommatyp ausreichend ist.

Hier ein Beispiel im 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 aus.

Versuchen Sie es jetzt erneut mit 10 ^ 20 Simbabwe-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, ist der Dollar verschwunden.

Wenn Sie den Integer-Typ verwenden, funktioniert es gut:

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

6
2017-07-22 14:56



Ich denke, dass der Hauptunterschied neben der Bitbreite ist, dass der Dezimalwert den Exponenten base 10 und double 2 hat

http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html


4
2017-11-26 13:23