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 本身不能用二进制精确表示。

现在,当您从该值创建 a 时BigDecimal,该“不完全 1.2”的值将完全保留。从构造函数的文档中:

将 double 转换为 BigDecimal,BigDecimal 是 double 的二进制浮点值的精确十进制表示。

...而当您使用new BigDecimal("1.2")结果时,结果恰好是1.2 -BigDecimal解析字符串,并且任何十进制字符串表示可以用 精确表示BigDecimal,因为这就是它的重点。

1.2 比“ double1.2 的最近表示”略大,因此res是 1。

于 2013-08-16T07:35:30.207 回答
2
a = new BigDecimal(x); // a= 1.1999999999999999555910790149937383830547332763671875
b = new BigDecimal(y); // b=1.2 

这是由于转换问题,因为将 double 转换为 BigDecimal,它是精确的十进制表示。

int res = res = b.compareTo(a); //res= 1 
于 2013-08-16T07:38:23.383 回答
1

因为1.2as double不是您期望的那样

于 2013-08-16T07:36:41.103 回答
1

尝试这个:

BigDecimal a = new BigDecimal(String.valueOf(x));
BigDecimal b = new BigDecimal(y);
于 2013-08-16T07:39:07.870 回答