1

Java 7 64 ビットで LibGDX プログラムに取り組んでいます。

float をパラメーターとして受け取る関数を junit を使用してテストすると、奇妙な結果が得られました。123.123456fパラメータとして使用して関数を呼び出すと、関数は receive を受け取り123.12346ます。なぜこれが起こるのですか?

12.123456fパラメータとして 使用すると、正しい結果が得られました。123.12345fまだ動作します。

したがって、私System.out.println(...)は入力をチェックするために使用します。

私にとっては重要ではありませんが、理由を知りたいだけです。どうもありがとうございました!

よろしく、 アントニー

4

1 に答える 1

3

fつまりfloat、単精度の IEEE-754浮動小数点数を意味します。それらはあまり正確ではなく、有効数字がおよそ 7 桁しかありません。倍精度浮動小数点数であるdforを使用すると、その値を 2 倍にすることができます (!)。これにより、約 15 桁の精度が得られます。doubleもちろん、これを渡すものは何でもdoubles だけでなく s も受け入れることが条件ですfloat。妥当な精度が必要な場合は、そうする必要があります。

ただし、ダブルでも問題があることに注意してください。完全な精度ではなく、より高い精度があります。IEEE-754 浮動小数点は、迅速な計算とコンパクトなストレージ用に設計されています。double であっても、古典的な不正確な例は であり0.1 + 0.2、これは として出力され0.30000000000000004ます。

通貨の数値を扱っていた場合 (そのライブラリではそうではないと思います)、 を見てくださいBigDecimal。それらははるかに大きく、はるかに遅く、独自の問題 ( を正確に表すことができないなど1 / 3) がありますが、通貨の場合はより良い選択になる可能性があります。

于 2014-02-21T15:12:56.100 に答える