首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较BigDecimal

比较BigDecimal
EN

Stack Overflow用户
提问于 2018-02-20 17:36:33
回答 3查看 12K关注 0票数 4

我有以下两个BigDecimal对象。

代码语言:javascript
复制
    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。我很困惑。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-20 17:54:36

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

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

关于文档的更精确:

BigDecimal.equals(Object)

将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和缩放比例e相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00 )。

BigDecimal.compareTo(BigDecimal)

将此BigDecimal与指定的BigDecimal进行比较。此方法将两个值相等但具有不同比例(如2.0和2.00)的BigDecimal对象视为相等。此方法优先于为六个布尔比较运算符(<、==、>、>=、!=、<=)中的每一个提供单独的方法。建议用于执行这些比较的习惯用法是:(x.compareTo(y) 0),其中是六个比较运算符之一。

你会发现equals使用刻度进行比较,给出了一些“奇怪”的结果。

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2018-02-20 17:42:33

对于BigDecimal,最好使用compareTo。如果a> b,此方法将返回大于零的数字;如果a == b,则返回0;如果a

票数 3
EN

Stack Overflow用户

发布于 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)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48881976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档