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.
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.
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.
Dieser "Bug" ist kein Bug. So funktioniert Fließkommarechnung. Siehe: Ссылка
Wenn Sie eine beliebige Genauigkeit in Java wünschen, verwenden Sie BigDecimal
:
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.
Dies sind Gleitkomma-Probleme und die Verwendung von BigDecimal
wird es beheben.
Die Reihenfolge der Subtraktion ändert sich auch in Google.
%Vor%Tags und Links java math coldfusion floating-point