我有两个BigDecimals
,value1
和value2
。我想将value1
除以value2
,但显然如果其中一个为零,我不想这样做。所以我写了这个简单的if语句:
if(!value1.equals(0) && !value2.equals(0)){
divide value1 by value2 blah blah blah
}
由于某种原因,这个if语句不起作用..即使其中一个值等于零,该等式仍然会被评估给我一个错误,因为我试图用或除以零。
我知道我可以使用value1.compareTo(BigDecimal.valueOf(0) == 1
并得到我想做的事情,但我只是好奇为什么我的第一种方法不起作用。
答案 0 :(得分:5)
Java将不同类型的对象视为不同的对象。这意味着即使它们代表的是等同的东西,它们也不一样。
关于BigDecimal的“特殊”是什么,即使类型相同且值相等,但具有不同的比例,它们仍然不是“等于”
Double d = 0.0;
Integer i = 0;
System.out.println(d + " equals " + i + " is " + (d.equals(i)));
BigDecimal bd2 = new BigDecimal("0.00");
BigDecimal bd3 = new BigDecimal("0.000");
System.out.println(bd2 + " equals " + d + " is " + (bd2.equals(d)));
System.out.println(bd2 + " equals " + bd2 + " is " + (bd2.equals(bd2)));
System.out.println(bd2 + " equals " + bd3 + " is " + (bd2.equals(bd3)));
打印
0.0 equals 0 is false
0.00 equals 0.0 is false
0.00 equals 0.00 is true
0.00 equals 0.000 is false
解决这个问题的方法是使用compareTo调整比例并为您提供更自然的比较。
System.out.println(bd2 + " compareTo " + BigDecimal.ZERO + " is " + (bd2.compareTo(BigDecimal.ZERO )));
System.out.println(bd3 + " compareTo " + BigDecimal.ZERO + " is " + (bd3.compareTo(BigDecimal.ZERO )));
打印
0.00 compareTo 0 is 0
0.000 compareTo 0 is 0
这意味着如果您要使用BigDecimal,则需要编写
if(value1.compareTo(BigDecimal.ZERO) != 0 && value2.compareTo(BigDecimal.ZERO) != 0) {
就个人而言,我更喜欢使用更简单,更快捷的double
。唯一的缺点是你必须自己管理舍入。
double div = value1 / value2;
if (0 < div && div < SOME_UPPER_SENSIBLE_LIMIT) {
// division was ok.
System.out.printf("%.4f", div); // print with rounding.
答案 1 :(得分:0)
改为使用它。
if(BigDecimal.ZERO.compareTo(value1) != 0 && BigDecimal.ZERO.compareTo(value2) != 0)
{
....
}
equals
无效。
检查一下:
public boolean equals(Object x)
将此BigDecimal与指定的Object进行相等性比较。与compareTo不同,此方法只考虑两个BigDecimal对象的值和比例相等(因此通过此方法比较时2.0不等于2.00)。