2016-05-29 12 views
2

Ich war verwirrt durch den Unterschied zwischen float und double. Ich lese this post. Ich dachte, der Unterschied liegt nur in der Präzision. Also habe ich erwartet, dass, wenn 0.1 + 0.2 == 0.3false zurückgibt, dann tut auch 0.1f + 0.2f == 0.3f.Float Arithemtik und doppelte Präzision?

Aber eigentlich 0.1f + 0.2f == 0.3f gibt true zurück. Warum das?

Ist das ein reines Java-Problem oder was?

Antwort

6

Nein, es ist nur ein Artefakt der Dezimal-Binär-Umwandlung .

Unter der Haube sind Fließkommazahlen binär dargestellt. Die Zahl 0,1 kann nicht genau binär dargestellt werden, so muss es auf die nächste darstellbare Zahl gerundet werden, von denen die float ist:

0,100000001490116119384765625

und die double ist:

0,1000000000000000055511151231257827021181583404541015625

So stellt es sich heraus, dass, wenn Sie die double nächsten 0,1 hinzufügen, und die double nächsten 0,2, dann runden das Ergebnis auf die nächste double, Sie erhalten nicht wirklich die double nächste 0.3, aber stattdessen erhalten Sie die eine nach ihm (die in der Regel als 0.30000000000000004 gedruckt wird, aber tatsächlich hat viel mehr Ziffern), daher der Mangel an Gleichheit.

Auf der anderen Seite, wenn Sie die float nächsten 0,1, und die float nächsten 0,2 hinzufügen, dann um dieses Ergebnis auf den nächsten float Sie tun, um die float nächsten 0,3 zu erhalten, damit die Gleichheit.

1

Sie sollen nicht immer vergleichen Schwimmern oder Doppelzimmer für Gleichheit, kann man nicht wirklich garantieren, dass die Zahl, die Sie mit dem Schwimmer zuweisen oder doppelt so hoch ist genau

+4

Diese Aussage ist * way * zu stark. Es gibt viele Situationen, in denen es durchaus sinnvoll ist, Floats oder Doubles für Gleichheit zu vergleichen. –