请看下面的代码
double a = 0.001; double b = 13.456; System.out.println(a); System.out.println(b); System.out.println(a+b); System.out.println(b-a);
运算的结果是
0.001 13.456 13.456999999999999 13.455;
表示对结果不太理解,难道ab相加的结果不应该是13.457么
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
Double は演算中に精度が失われます。演算には java.math.BigDecimal を使用することをお勧めします。
これは、コンピューターの浮動小数点数が不正確になる可能性があるため (その可能性があることに注意してください)、正確な値に限りなく近い値しか得ることができませんが、完全に正確であることはできません。なぜそうなるのでしょうか?これは、浮動小数点数の格納規則によって決まります。まず、「2 を掛けて四捨五入し、順番に並べる」方法を使用して、10 進数 0.4 を 2 進数の 10 進数に変換する方法を見てみましょう。これは簡単です、あまりにも基本的です)、2 進数の世界では 0.4 は正確に表現できない、つまり、「表示」できないことがわかりました。メモリ (浮動小数点数) にのみ格納されます。ストレージには、符号ビット、指数ビット、仮数の 3 つの部分が含まれます (詳細は説明しません)。10 進数の世界では 1/3 を正確に表す方法がないことが理解できます。そしてもちろん、2 進数の世界では 1/5 を正確に表す方法はありません (2 進数に分数がある場合は、2 進数の世界では 1/5 は無限に繰り返される 10 進数です)。
Double は演算中に精度が失われます。演算には java.math.BigDecimal を使用することをお勧めします。
これは、コンピューターの浮動小数点数が不正確になる可能性があるため (その可能性があることに注意してください)、正確な値に限りなく近い値しか得ることができませんが、完全に正確であることはできません。なぜそうなるのでしょうか?これは、浮動小数点数の格納規則によって決まります。まず、「2 を掛けて四捨五入し、順番に並べる」方法を使用して、10 進数 0.4 を 2 進数の 10 進数に変換する方法を見てみましょう。これは簡単です、あまりにも基本的です)、2 進数の世界では 0.4 は正確に表現できない、つまり、「表示」できないことがわかりました。メモリ (浮動小数点数) にのみ格納されます。ストレージには、符号ビット、指数ビット、仮数の 3 つの部分が含まれます (詳細は説明しません)。10 進数の世界では 1/3 を正確に表す方法がないことが理解できます。そしてもちろん、2 進数の世界では 1/5 を正確に表す方法はありません (2 進数に分数がある場合は、2 進数の世界では 1/5 は無限に繰り返される 10 進数です)。