検索

ホームページ  >  に質問  >  本文

关于java double类型运算的困惑

请看下面的代码

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么

高洛峰高洛峰2887日前348

全員に返信(2)返信します

  • 迷茫

    迷茫2017-04-17 17:43:32

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

    返事
    0
  • 高洛峰

    高洛峰2017-04-17 17:43:32

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

    返事
    0
  • キャンセル返事