比较 BigDecimal

9
我有以下两个BigDecimal对象。
    BigDecimal one = new BigDecimal(3.0);
    BigDecimal two = new BigDecimal(3.00);

    System.out.println(one.scale());//0
    System.out.println(two.scale());//0
    System.out.println(one.equals(two));//true

我已经阅读了JavaDocs,但无法理解equalscompareTo方法之间的区别。JavaDoc表示这些对象通过equals方法不相等,结果必须为false,但实际上结果是true。我感到困惑。


3
new BigDecimal(3.0);更改为new BigDecimal("3.0");,你将会看到它们之间的区别。 - user8097737
2
无论您添加多少个零,参数都是相同的,3.0 == 3.00true - Arnaud
https://github.com/mortezaadi/bigdecimal-utils - Morteza Adi
3个回答

12

您需要使用String构造函数来获取正确的比例,因为BigDecimal(double)将获得可能的最小比例。

将double转换为BigDecimal,该BigDecimal是double二进制浮点值的精确十进制表示。 返回的BigDecimal的比例是最小值,使得(10scale×val)为整数。

有关文档的更多详细信息:

BigDecimal.equals(Object)

将此 BigDecimal 与指定对象进行比较以确定是否相等。与 compareTo 不同,此方法仅在两个 BigDecimal 对象的值和标度相等时才认为它们相等(因此,当使用此方法进行比较时,2.0 不等于 2.00)。

BigDecimal.compareTo(BigDecimal)

比较此BigDecimal与指定的BigDecimal。此方法认为在值上相等但具有不同刻度(例如2.0和2.00)的两个BigDecimal对象是相等的。提供此方法优先于每个六个布尔比较运算符(<、==、>、>=、!=、<=)的各个方法。执行这些比较的建议习惯用法是(x.compareTo(y) 0),其中是六个比较运算符之一。你会发现equals使用了刻度进行比较,从而得到一些“奇怪”的结果。
BigDecimal bd1 = new BigDecimal("2"); //scale 0
BigDecimal bd2 = new BigDecimal("2.00"); //scale 2

bd1.equals(bd2); //false
bd1.compareTo(bd2); //0 => which means equivalent

1
我认为引用JavaDoc并不有用,因为楼主在他的测试用例中只是犯了个“小”错误。而且他已经指出自己已经阅读过它了。 - user8097737
@devpuh说:“但是我不明白equals和compareTo方法之间的区别”,这意味着它没有被理解...对于未来的读者来说,更完整的解释会更有用。因此,是有用的,因为OP没有提到他想要做什么。 - AxelH

3

使用compareTo比较BigDecimal更好。该方法将返回一个大于零的数字,如果a > b,返回0如果a == b,返回小于零的数字,如果a < b。


3

将新的BigDecimal(3.0);更改为新的BigDecimal("3.0");,你会看到区别。

您使用了带有double-literal的构造函数new BigDecimal(double val),其值仅为3,无论您写3.0还是3.0000都没关系。
此外,请注意此构造函数,因为它表示double二进制浮点值的准确十进制表示,因此new BigDecimal(0.1)会创建一个BigDecimal,其值为0.1000000000000000055511151231257827021181583404541015625(请参阅JavaDoc)。

最好(始终)使用构造函数new BigDecimal(String val)


不错的观点,请看看这篇文章 - felix at housecat

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