BigDecimal bd= new BigDecimal("00.0000000000");
//now bd format to 0E-10
if(BigDecimal.ZERO.equals(bd) || bd.equals("0E-10"))
{
flag=true;
}
上述代码存在两个问题:
- 变量 bd 为什么会自动格式化为 0E-10
- if条件语句的结果为假,即代码不会进入if块中。
BigDecimal bd= new BigDecimal("00.0000000000");
//now bd format to 0E-10
if(BigDecimal.ZERO.equals(bd) || bd.equals("0E-10"))
{
flag=true;
}
在构造函数中,您在小数点后面提供了十个数字,因此即使所有数字都为零,BigDecimal
仍然决定将其内部的scale
设置为10。这解释了"0E-10"
中的-10
。
至于equals
,Javadoc说:
将此
BigDecimal
与指定的Object
进行比较以实现相等性。 与compareTo
不同,此方法仅在值和比例相等时才将两个BigDecimal
对象视为相等 (因此,当使用此方法进行比较时,2.0不等于2.00)。
底线:
compareTo()
而不是 equals()
。 BigDecimal
与 String
进行比较,因为这样无法工作。您可以使用以下方法测试是否为零:
bd.signum() == 0
BigDecimal.equals
方法还包括比例(在你的情况下是10),因此会失败。通常应使用 compareTo
来比较 BigDecimals
。
BigDecimal使用10位小数精度,因为你在小数点后给出了十个数字,这回答了你的第一个问题。
对于if语句,第一部分中,你正在将0与00.00000000000进行比较(精度不同,所以它们并不相同)。而在第二部分中,你正在将一个字符串与BigDecimal进行比较。这是行不通的。