1

私はちょうど BigDecimal についてもっと学ぼうとしていますが、以下のコードは私を混乱させます。

Double x = 1.2;
String y = "1.2";

BigDecimal a = BigDecimal.ZERO;
BigDecimal b = BigDecimal.ZERO;

a = new BigDecimal(x);
b = new BigDecimal(y);

int res = res = b.compareTo(a);

if(res==1){
    System.out.println("Die");
}else if(res ==0){
    System.out.println("Live");
}else if (res==-1){
    System.out.println("God Loves you");
}

結果=死ぬ

私は「死ぬ」準備ができていません。なぜ BigDecimal は私を殺そうとしているのでしょう。

4

4 に答える 4

10

この文:

Double x = 1.2;

は、表現可能な最も近いdoubleを 1.2 から に割り当てxます。これは 1.2未満です。値 1.2 自体は 2 進数で正確に表すことはできません。

その値からを作成するBigDecimalと、「1.2 ではない」値が正確に保持されます。コンストラクターのドキュメントから:

double を、double のバイナリ浮動小数点値の正確な 10 進数表現である BigDecimal に変換します。

...一方、使用new BigDecimal("1.2")すると結果は正確に1.2BigDecimalになります。文字列を解析し、10 進文字列表現はで正確に表すことができBigDecimalます。これが全体のポイントです。

double1.2 は「 1.2 の最も近い表現」よりわずかに大きいためres、1 です。

于 2013-08-16T07:35:30.207 に答える