我有两个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,但是任何地方都无法理解equals
和compareTo
方法之间的区别。 JavaDoc说这些对象不等于equals
方法,结果必须是false
,但结果是true
。我很困惑。
答案 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与指定的Object进行相等性比较。 与compareTo不同,此方法只考虑两个BigDecimal对象的值相等且scal e(因此通过此方法比较时2.0不等于2.00)。
将此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");
,如果您编写3
或3.0
,则无关紧要。
/>
另外要小心这个构造函数,因为它表示双精度二进制浮点值的精确十进制表示,因此3.0000
创建一个值为new BigDecimal(0.1)
的BigDecimal (参见JavaDoc)
更好(始终)使用构造函数new BigDecimal(String val)
。