1015 Stimmen

dezimal vs. doppelt! - Welchen Wert sollte ich wann verwenden?

Ich sehe immer wieder Leute, die Doubles in C# verwenden. Ich weiß, dass ich irgendwo gelesen habe, dass Doubles manchmal an Präzision verlieren. Meine Frage ist, wann sollte ich einen Double-Typ und wann einen Dezimaltyp verwenden? Welcher Typ ist für Geldberechnungen geeignet? (z. B. größer als 100 Millionen Dollar)

8 Stimmen

Möchten Sie Bruchteile von Cents? (wie an Tankstellen)

0 Stimmen

4 Stimmen

Es gibt eigentlich eine faire Antwort: decimal funktioniert wie long und int (es ist ein ganzzahliger Typ!), aber es hat irgendwo in seiner Syntax und seinem Ausgabeformat einen Punkt (siehe de.wikipedia.org/wiki/Ganzzahl_(Computer_wissenschaft) ). Double und Float arbeiten mit einer Mantisse und einem Exponenten (siehe de.wikipedia.org/wiki/Schwebender_Punkt ). Das war's.

9voto

Otto Allmendinger Punkte 26430

Eindeutig Ganzzahlige Typen für Ihre Geldberechnungen verwenden.
Dies kann nicht genug betont werden, denn auf den ersten Blick könnte man meinen, dass ein Fließkommatyp ausreichend ist.

Hier 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 aus.

Versuchen Sie dies nun 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 Typ Integer verwenden, funktioniert das problemlos:

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

9 Stimmen

Man braucht nicht einmal sehr große/kleine Werte, um Unterschiede zwischen der doppelten Basis-2-Näherung und den tatsächlichen Basis-10-Werten festzustellen, da viele kleine Werte nicht genau gespeichert werden können. Berechnen Sie "1 - 0,1 - 0,9" (stellen Sie sicher, dass der Compiler die Gleichung nicht optimiert), und vergleichen Sie sie mit Null. Sie werden feststellen, dass das Ergebnis bei Doubles etwa 2e-17 statt 0 ist (stellen Sie sicher, dass Sie einen Vergleich durchführen, da viele Print/ToString-Funktionen Doubles nach einer bestimmten Anzahl von Dezimalstellen abrunden, um diese Art von Fehlern zu vermeiden).

3 Stimmen

Und was passiert, wenn Sie 1,5 Dollar haben?

4 Stimmen

@Noctis du wirst eine Lösung finden, wenn du darüber nachdenkst

6voto

honzajscz Punkte 2572

Ich denke, dass der Hauptunterschied neben der Bitbreite darin besteht, dass der Dezimalwert die Basis 10 und der Double-Wert die Basis 2 hat.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X