1

このコードを使用すると、なぜ精度が失われるのか疑問に思っています:

double x = 12.0456;    // or float : same result
System.out.println(x); // outputs 12.0456 obviously
x %= 1;                // should now be equal to 0.0456 right?
System.out.println(x); // outputs 0.04560000000000031 or 0.045599937 when using float

12.0456 modulo 1 は 0.0456 に等しいはずですよね? しかし、わずかに異なる値を示しています。なぜ精度が下がり続けるのでしょうか? つまり、値が 1 未満になるまで、コードは正確に 1 を減算する必要があります。

ただし、正しい値を取得する方法を見つけました。

double x = 12.0456;
System.out.println(x);
x %= 1;
System.out.println((float)x); //outputs 0.0456 exactly

この方法は完璧に機能しますが、もっと良い解決策はありますか?

どの浮動小数点型を使用する必要があるかは気にしません。正しい値を取得するためのクリーンな方法を見つけたいだけです。値を double に変換してから float に変換する必要はありません。

4

1 に答える 1

2

float と double は不正確です。値を表すビット数は有限です。

人間は基数 10 を使用し、コンピューターは基数 2 を使用するため、私たちには「単純」に見える数値を float/double として正確に表現することは不可能な場合があります。特に、CPU がそれらを実行する方法による計算結果はそうです。

于 2013-02-09T22:59:34.813 に答える