我有以下两个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。我很困惑。
发布于 2018-02-20 17:54:36
您需要使用String构造函数来获得正确的比例,因为BigDecimal(double)将尽可能获得较小的比例
将double转换为BigDecimal,这是double的二进制浮点值的精确十进制表示。返回的BigDecimal的小数位数是一个最小值,使得(10scale×val)是一个整数。
关于文档的更精确:
将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和缩放比例e相等时才认为它们相等(因此,使用此方法进行比较时,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发布于 2018-02-20 17:42:33
对于BigDecimal,最好使用compareTo。如果a> b,此方法将返回大于零的数字;如果a == b,则返回0;如果a
发布于 2018-02-20 17:52:56
将新BigDecimal(3.0);更改为新BigDecimal("3.0");,您将看到不同之处。
您使用了带有双字面值的构造函数new BigDecimal(double val),该值仅为3,无论您编写的是3.0还是3.0000。
还要注意这个构造函数,因为它代表了double的二进制浮点值的精确的十进制表示,因此new BigDecimal(0.1)创建了一个值为0.1000000000000000055511151231257827021181583404541015625的BigDecimal (参见JavaDoc)
最好(总是)使用构造函数new BigDecimal(String val)。
https://stackoverflow.com/questions/48881976
复制相似问题