2017-10-04 3 views
2

Ich habe den folgenden Code:Debugger Runden float Zahlen ... Warum passiert das und wie man es umgehen?

public static float FLOAT_VALUE = 0.899999761581421f; 

Aber immer, wenn ich diesen Wert mit dem Debugger aufrufen, sehe ich, dass es jetzt 0.9f geworden ist. Warum passiert das und wie komme ich damit klar?

+2

https://stackoverflow.com/questions/588004/is-floating-point-math-broken – epascarello

+2

'float' hat [6 bis 9 signifikanten Dezimalstellen Präzision] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32). Sie geben 15 Genauigkeitsziffern an. 'float' kann das nicht speichern, aber' double' kann, da es [15 bis 17 signifikante Dezimalstellen Genauigkeit hat] (https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating- point_format: _binary64). – Andreas

+0

Der Debugger rundet auf weniger Ziffern als es sollte. Der nächste Float zu 0.899999761581421 ist 0.89999973773956298828125. Der nächstliegende Wert von 0,9 ist 0.99999997615814208984375. Sie sind anders. Die toString Konvertierung Ihres Floats ist 0.89999974, nicht 0.9 –

Antwort

3

Entweder ändert sich der Wert wirklich, oder es ist wahrscheinlicher, dass der Debugger nicht genügend Ziffern anzeigt, um verschiedene Gleitkommazahlen zu unterscheiden.

Der nächstgelegene Schwimmer zu 0.899999761581421 ist 0.89999973773956298828125. Der nächstliegende Wert von 0,9 ist 0.99999997615814208984375. Sie sind anders.

Die toString Umwandlung von 0,89999973773956298828125 ist 0,89999974, nicht 0,9