Der Rundungsfehler ist nicht zufällig und versucht durch seine Implementierung, den Fehler zu minimieren. Dies bedeutet, dass der Fehler manchmal nicht sichtbar ist oder kein Fehler vorliegt.
Zum Beispiel 0.1
ist nicht genau 0.1
dh new BigDecimal("0.1") < new BigDecimal(0.1)
aber 0.5
genau1.0/2
Dieses Programm zeigt Ihnen die wahren Werte.
BigDecimal _0_1 = new BigDecimal(0.1);
BigDecimal x = _0_1;
for(int i = 1; i <= 10; i ++) {
System.out.println(i+" x 0.1 is "+x+", as double "+x.doubleValue());
x = x.add(_0_1);
}
druckt
0.1000000000000000055511151231257827021181583404541015625, as double 0.1
0.2000000000000000111022302462515654042363166809082031250, as double 0.2
0.3000000000000000166533453693773481063544750213623046875, as double 0.30000000000000004
0.4000000000000000222044604925031308084726333618164062500, as double 0.4
0.5000000000000000277555756156289135105907917022705078125, as double 0.5
0.6000000000000000333066907387546962127089500427246093750, as double 0.6000000000000001
0.7000000000000000388578058618804789148271083831787109375, as double 0.7000000000000001
0.8000000000000000444089209850062616169452667236328125000, as double 0.8
0.9000000000000000499600361081320443190634250640869140625, as double 0.9
1.0000000000000000555111512312578270211815834045410156250, as double 1.0
Hinweis: Das 0.3
ist etwas falsch, aber wenn Sie zu 0.4
den Bits kommen, müssen Sie eine nach unten verschieben, um in die 53-Bit-Grenze zu passen, und der Fehler wird verworfen. Wieder zurück ein Fehler einschleicht für 0.6
und 0.7
aber für 0.8
zu 1.0
den Fehlern verworfen.
Durch fünfmaliges Hinzufügen sollte der Fehler kumuliert und nicht abgebrochen werden.
Der Grund für einen Fehler liegt in der eingeschränkten Genauigkeit. dh 53-Bit. Dies bedeutet, dass, da die Anzahl mehr Bits verwendet, wenn sie größer wird, Bits am Ende entfernt werden müssen. Dies führt zu Rundungen, die in diesem Fall zu Ihren Gunsten sind.
Sie können den gegenteiligen Effekt erzielen, wenn Sie eine kleinere Zahl erhalten, z. B. 0.1-0.0999
=>, 1.0000000000000286E-4
und Sie sehen mehr Fehler als zuvor.
Ein Beispiel hierfür ist, warum in Java 6 Math.round (0.49999999999999994) 1 zurückgibt. In diesem Fall führt der Verlust eines Bits bei der Berechnung zu einem großen Unterschied zur Antwort.