4
    System.out.println(2.14656);

2.14656

    System.out.println(2.14656%2);

0.14656000000000002

なんてこと?

4

3 に答える 3

13

期待される結果が得られます。あなたの期待は正しくありません。

倍精度リテラルを入力する2.14656と、実際に得られるのは最も近い倍精度値です。これは次のとおりです。

2.14656000000000002359001882723532617092132568359375

これは、出力時に(有効数字17桁に)丸められるため、期待どおりの値が表示されprintlnます。

モジュラス演算(正確)の後、値は次のようになります。

0.14656000000000002359001882723532617092132568359375

繰り返しになりますが、これは印刷時に丸められますが、先頭の桁が1つ少ないため、丸めのポイントは1桁右になり、末尾にが表示されます2

于 2010-10-08T18:13:22.387 に答える
4

基数 2 のシステムは、基数 10 の任意精度の数値を格納するために使用されています。

整数バイナリを使用する場合、「丸め」数は 2、4、8、16、32、64 などです。これらのいずれも、10、100、1000、10000、または " 10 進法の数値。

CPU 内での高速操作のために、float 値と double 値が構築されました。1.42E-13 を 2.11E47 で除算している場合でも、複数の数値間の計算をすばやく行うことができます。これらは、基数 10 で「丸め」数を提供するようには作成されていません。これは、その決定の副作用です。

浮動小数点数を使用する場合、これが発生することを受け入れる必要があります。100% 正確ではありませんが、それ以外は正確です。したがって、100% の精度が必要な場合は浮動小数点変数を使用しないでください。これを行う必要がある場合は、int 値に格納する方法を見つけてください。また、浮動小数点数を使用する場合は、出力を小数点以下の桁数に丸めて、時々表示されることを避けることもお勧めします。

たとえば、私は金融業界で働いており、市場価格を実際の価格ではなくティック数で表しています。価格を表示する必要がある場合、この値にティック サイズ、1/100、1/32、1/20 などを掛けてから、適切な小数点以下の桁数に丸めます。ティック数、ティック サイズの分子と分母はすべて、データベースに整数として保存されます。移動平均などの計算された値を除いて、浮動小数点値は実際には保存されません。

于 2010-10-08T17:53:43.083 に答える
0

http://en.wikipedia.org/wiki/Round-off_error#Representation_error

于 2010-10-08T17:35:23.977 に答える