double 変数を使用して (360-359.9998779296875) の結果 (0.0001220703125) を格納するコードを見ています。double 変数はこれを -1.220703125E-4 として格納します。BigDecimal を使用すると、0.0001220703125 として保存されます。double が -1.220703125E-4 として保存するのはなぜですか?
3 に答える
ここでは精度の問題については言及しませんが、数値が出力される方法についてのみ言及します。
のjavadocでDouble#toString
説明されているように:
m が 10^-3 未満または 10^7 以上の場合、いわゆる「コンピュータ科学表記法」で表されます。
のjavadocBigDecimal#toString
に対して:
位取りが 0 以上で、調整後の指数が -6 以上の場合、数値は指数表記を使用せずに文字形式に変換されます。
この小さなプログラムを試して、さまざまな出力形式を確認できます。特に、表現が標準表記法から科学表記法に切り替わるしきい値が 2 つのクラスで同じではありません。
出力:
0.5 0.5
3.0517578125E-5 0.000030517578125
9.5367431640625E-7 9.5367431640625E-7
コード:
public static void main(String args[]) {
//trying to use numbers with an exact double representation
double d1 = 0.5;
double d2 = 0.000030517578125;
double d3 = 0.00000095367431640625;
BigDecimal bd1 = new BigDecimal(d1);
BigDecimal bd2 = new BigDecimal(d2);
BigDecimal bd3 = new BigDecimal(d3);
System.out.println(d1 + "\t\t\t" + bd1);
System.out.println(d2 + "\t\t" + bd2);
System.out.println(d3 + "\t" + bd3);
}
http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html
これらを格納するための基礎となるデータ構造は異なります (私の記憶では、浮動小数点はより広い範囲の値を持つことができますが、BigDecimal はより正確です)、実際に表示されているのは、同じ数値を出力する別の方法です。浮動小数点の範囲が広いため、このように存在すると思います。科学的表記法なしで途方もなく大きな数を出力するのは不快なので、科学的表記法がデフォルトであると思います。
どちらも同じです。使用しているツール/IDEが何であれ、それらを異なる形式で表示しています。