0E30不是零

时间:2012-01-06 18:26:43

标签: java bigdecimal

我不知道如何处理new BigDecimal("0E30")。它的值为0但不与BigDecimal.ZERO进行比较。见下文:

System.out.println(new BigDecimal("0E30").add(BigDecimal.ONE));     // ---> 1
System.out.println(new BigDecimal("0E30").equals(BigDecimal.ZERO)); // ---> false

有人可以帮助我进行比较吗(我知道我可以通过将BigDecimal转换为double来获得解决方法,但我想知道发生了什么事情? 我正在使用JRE 1.6.3。 感谢

2 个答案:

答案 0 :(得分:7)

来自docs(强调是我的):

  

将此BigDecimal与指定的Object进行相等性比较。   与compareTo不同,此方法仅考虑两个BigDecimals相等   它们值相等且 scale (因此2.0不等于2.00时   通过这种方法进行比较)。

在这种情况下,比例不匹配。因此,您应该使用compareTo()

BigDecimalequals()compareTo()不一致的案例之一:

  

注意:如果要将BigDecimals用作键,则应该小心   在SortedMap中或SortedSet中的元素,如BigDecimal的自然   排序与equals 不一致。请参阅Comparable,SortedMap或   SortedSet以获取更多信息。

答案 1 :(得分:1)

来自the docs

public boolean equals(Object x)

    Compares this BigDecimal with the specified Object for equality. 
    Unlike compareTo, this method considers two BigDecimal objects equal 
    only if they are equal in value and scale (thus 2.0 is not equal to 
    2.00 when compared by this method).

你的体重不同。如果您希望它们相等,请使用compareTo