我只是想了解更多关于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会一心想要杀了我。
答案 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)
因为1.2
为双is not what you expect it to be。
答案 3 :(得分:1)
试试这个:
BigDecimal a = new BigDecimal(String.valueOf(x));
BigDecimal b = new BigDecimal(y);