java中的BigDecimal问题

时间:2011-09-23 06:49:45

标签: java bigdecimal

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. 如果条件导致错误值,即它不会进入如果阻止。
  3. 任何人都可以建议。感谢

3 个答案:

答案 0 :(得分:14)

您已经在小数点后面给出了10位数的构造函数,所以即使它们都为零,BigDecimal已决定将其内部scale设置为10.这解释了{{1在-10

关于"0E-10"Javadoc says

  

将此equals与指定的BigDecimal进行比较以获得相等性。   与Object不同,此方法认为两个compareTo个对象相等   只有它们在价值和规模上相等(因此2.0不等于   2.00用这种方法比较时。)

底线:

  1. 使用compareTo()代替BigDecimal
  2. 请勿直接将equals()BigDecimal进行比较,因为这不起作用。

答案 1 :(得分:6)

您可以使用

测试零
bd.signum() == 0

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

答案 2 :(得分:1)

BigDecimal使用10的等级,因为你在小数点后面给出了十位数,这就是你的第一个点。

对于if,对于第一部分,您将0与00.00000000000进行比较(比例不同,因此它们不相同)。在第二个中,您将String与BigDecimal进行比较。哪个不行。