Warum ist diese Subtraktion nicht gleich Null?

7

Ich bin auf diese Werte in meinem ColdFusion-Code gestoßen, aber der Google-Rechner scheint den gleichen "Bug" zu haben, bei dem der Unterschied nicht Null ist.

416582.2850 - 411476.8100 - 5105.475 = -2,36468622461E-011

Ссылка

JavaCast'ing diese zu long / float / double hilft nicht - es führt zu anderen Nicht-Null-Unterschiede.

    
Brian Pan 04.01.2010, 22:44
quelle

7 Antworten

16

Dies liegt daran, dass Dezimalzahlen, die in der Basis 10 "rund" aussehen, in der Basis 2 nicht genau dargestellt werden können (was Computer zur Darstellung von Gleitkommazahlen verwenden). Bitte lesen Sie den Artikel Was jeder Informatiker über Gleitkommaarithmetik wissen sollte für eine detaillierte Erklärung von Dieses Problem und Problemumgehungen.

    
Greg Hewgill 04.01.2010, 22:47
quelle
7

Gleitkomma-Ungenauigkeiten (es gibt unendlich viele reelle Zahlen und nur eine endliche Anzahl von 32- oder 64-Bit-Zahlen, um sie darzustellen).

Wenn Sie mit kleinen Fehlern nicht umgehen können, sollten Sie BigDecimal verwenden. statt.

    
Michael Myers 04.01.2010 22:46
quelle
6

Verwenden Sie PrecisionEvaluate() in ColdFusion (es wird BigDecimal in Java verwenden)

%Vor%

Im Gegensatz zu Evaulate() wird kein "" benötigt.

    
Henry 05.01.2010 00:25
quelle
2

Da der Computer Zahlen im Binärformat speichert, sind die Gleitkommazahlen ungenau. 1E-11 ist ein kleiner Unterschied, da diese Dezimalzahlen auf die nächste darstellbare Binärzahl gerundet werden.

    
yu_sha 04.01.2010 22:48
quelle
2

Dieser "Bug" ist kein Bug. So funktioniert Fließkommarechnung. Siehe: Ссылка

Wenn Sie eine beliebige Genauigkeit in Java wünschen, verwenden Sie BigDecimal :

%Vor%     
Bart Kiers 04.01.2010 22:49
quelle
1

Das Problem ist die ungenaue Darstellung von Fließkommatypen. Da diese nicht genau als Floats dargestellt werden können, erhalten Sie einen gewissen Präzisionsverlust, der dazu führt, dass Vorgänge kleine Fehler aufweisen. Normalerweise möchten Sie mit floats vergleichen, ob das Ergebnis innerhalb eines kleinen epislon (Fehlerfaktors) einem anderen Wert entspricht.

    
tvanfosson 04.01.2010 22:47
quelle
1

Dies sind Gleitkomma-Probleme und die Verwendung von BigDecimal wird es beheben.

Die Reihenfolge der Subtraktion ändert sich auch in Google.

%Vor%     
danielrsmith 04.01.2010 22:53
quelle