3
double d = 0.0;
    for (int i = 0; i < 10; i++)
    {
        d = d+0.1;
    }
    System.out.println(d);

これは、「驚き最小の原則」のどこかで読んだ例です。

コードが0.999999999を返す理由に興味があり、dのデータ型をfloatに変更すると、1.000001が得られます。そのような行動の背後にある理由は何ですか。

4

1 に答える 1

7

これは、浮動小数点数の不正確さの典型的なケースです。0.1は2進数(繰り返しの数値)ではきれいに表現できないため、数値が何度も追加されるため、丸め誤差が発生します。フロートに変更したときの動作の違いは、ストレージのより多くのビットの過程で実際に0.1が保持される方法の違いに帰着します。

10進数の本当に正確な表現が必要な場合は、BigDecimalクラスがすぐに親友になります。精度を損なうことなく小数の詳細を内部的に保存する方法に基づいて、計算はその整合性を維持します。

于 2013-03-21T20:32:13.210 に答える