两个数字的差异 - BigDecimal

时间:2013-08-16 07:32:23

标签: java bigdecimal

我只是想了解更多关于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 个答案:

答案 0 :(得分:10)

本声明:

Double x = 1.2;

最近double - 可表示的值指定为1.2到x。这只是少于而不是1.2 - 值1.2本身不能用二进制表示。

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

  

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

...当您使用new BigDecimal("1.2")时,结果正好 1.2 - BigDecimal解析字符串,任何十进制字符串表示都可以BigDecimal完全表示,因为这是它的全部要点。

1.2略大于“最近double表示1.2”,因此res为1。

答案 1 :(得分: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 

答案 2 :(得分:1)

答案 3 :(得分:1)

试试这个:

BigDecimal a = new BigDecimal(String.valueOf(x));
BigDecimal b = new BigDecimal(y);