Java 中的 BigDecimal 问题

8
BigDecimal bd= new BigDecimal("00.0000000000");
//now bd format to 0E-10
if(BigDecimal.ZERO.equals(bd) || bd.equals("0E-10"))
{
 flag=true; 
}

上述代码存在两个问题:
  1. 变量 bd 为什么会自动格式化为 0E-10
  2. if条件语句的结果为假,即代码不会进入if块中。
请问有人可以提供建议吗?谢谢。
3个回答

17

在构造函数中,您在小数点后面提供了十个数字,因此即使所有数字都为零,BigDecimal仍然决定将其内部的scale设置为10。这解释了"0E-10"中的-10

至于equalsJavadoc说

将此 BigDecimal 与指定的 Object 进行比较以实现相等性。 与 compareTo 不同,此方法仅在值和比例相等时才将两个 BigDecimal 对象视为相等 (因此,当使用此方法进行比较时,2.0不等于2.00)。

底线:

  1. 使用 compareTo() 而不是 equals()
  2. 不要直接将 BigDecimal String 进行比较,因为这样无法工作。

7

您可以使用以下方法测试是否为零:

bd.signum() == 0

BigDecimal.equals 方法还包括比例(在你的情况下是10),因此会失败。通常应使用 compareTo 来比较 BigDecimals


1

BigDecimal使用10位小数精度,因为你在小数点后给出了十个数字,这回答了你的第一个问题。

对于if语句,第一部分中,你正在将0与00.00000000000进行比较(精度不同,所以它们并不相同)。而在第二部分中,你正在将一个字符串与BigDecimal进行比较。这是行不通的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接