关于java double类型运算的困惑
高洛峰
高洛峰 2017-04-17 17:41:32
0
2
336

请看下面的代码

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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
迷茫

Double は演算中に精度が失われます。演算には java.math.BigDecimal を使用することをお勧めします。

いいねを押す +0
小葫芦

これは、コンピューターの浮動小数点数が不正確になる可能性があるため (その可能性があることに注意してください)、正確な値に限りなく近い値しか得ることができませんが、完全に正確であることはできません。なぜそうなるのでしょうか?これは、浮動小数点数の格納規則によって決まります。まず、「2 を掛けて四捨五入し、順番に並べる」方法を使用して、10 進数 0.4 を 2 進数の 10 進数に変換する方法を見てみましょう。これは簡単です、あまりにも基本的です)、2 進数の世界では 0.4 は正確に表現できない、つまり、「表示」できないことがわかりました。メモリ (浮動小数点数) にのみ格納されます。ストレージには、符号ビット、指数ビット、仮数の 3 つの部分が含まれます (詳細は説明しません)。10 進数の世界では 1/3 を正確に表す方法がないことが理解できます。そしてもちろん、2 進数の世界では 1/5 を正確に表す方法はありません (2 進数に分数がある場合は、2 進数の世界では 1/5 は無限に繰り返される 10 進数です)。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート