比较BigDecimal

时间:2018-02-20 09:36:33

标签: java

我有两个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 个答案:

答案 0 :(得分:2)

最好将compareTo用于BigDecimal。如果&gt;该方法将返回大于零的数字。 b,如果a == b则为0,如果a <= b则小于零。 B'/ P>

答案 1 :(得分:2)

您需要使用String构造函数来获得正确的比例,因为BigDecimal(double)将获得小规模

  

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

关于文档的更精确:

BigDecimal.equals(Object)

  

将此BigDecimal与指定的Object进行相等性比较。 与compareTo不同,此方法只考虑两个BigDecimal对象的值相等且scal e(因此通过此方法比较时2.0不等于2.00)。

BigDecimal.compareTo(BigDecimal)

  

将此BigDecimal与指定的BigDecimal进行比较。 此方法认为两个值相等但具有不同比例(如2.0和2.00)的BigDecimal对象。优选地为六个布尔比较运算符(&lt;,==,&gt;,&gt; =,!=,&lt; =)中的每一个提供单独的方法。建议用于执行这些比较的习惯用法是:(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

答案 2 :(得分:1)

将新的bucket [,1] 1 -0.8125594 2 -0.7590050 3 -0.7189301 4 -0.7188391 5 -0.5047816 6 -0.3439579 7 -0.4376782 8 -0.1300217 9 0.9145718 10 2.1844290 11 4.8374356 更改为新的BigDecimal(3.0);,您会看到差异。

您使用了构造函数new BigDecimal(double val),其中双字面值只有BigDecimal("3.0");,如果您编写33.0,则无关紧要。
/> 另外要小心这个构造函数,因为它表示双精度二进制浮点值的精确十进制表示,因此3.0000创建一个值为new BigDecimal(0.1)的BigDecimal (参见JavaDoc)

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