首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同尺度的BigDecimal#compareTo

不同尺度的BigDecimal#compareTo
EN

Stack Overflow用户
提问于 2018-06-13 23:30:57
回答 2查看 3.2K关注 0票数 1

为什么以下内容返回1

代码语言:javascript
复制
new BigDecimal(0.82).setScale(5, BigDecimal.ROUND_HALF_DOWN)
    .compareTo(new BigDecimal(0.82))

我预计这将返回0,因为BigDecimal.compareTo 根据其文档忽略了缩放

将此BigDecimal与指定的BigDecimal进行比较。两个BigDecimal对象(如2.02.00)在值上是相等的,但是有一个不同的标度(如2.02.00),因此被认为是相等的。..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-13 23:44:09

new BigDecimal(0.82)实际上不是0.82,因为您要向构造函数传递一个double值--最接近于0.82的double,而不是确切的0.82 --因此new BigDecimal(0.82)是一个BigDecimal,等于最接近0.82的double

相反,使用new BigDecimal("0.82")

票数 7
EN

Stack Overflow用户

发布于 2018-06-13 23:55:21

问题是您使用了构造函数BigDecimal#BigDecimal(double)。它返回一个BigDecimal,它表示双二进制浮点值(参见其文档 )。但是,0.82并不表示值0.82,而是

代码语言:javascript
复制
0.81999999999999995115018691649311222136020660400390625

由于这个原因,.setScale(5, BigDecimal.ROUND_HALF_DOWN)实际上改变了值,而不仅仅是标度。应用该方法后的结果值为

代码语言:javascript
复制
0.82000

compareTo方法忽略标度,但不忽略不同值的。如前所述,两个BigDecimal实际上表示不同的值。因此,compareTo不返回0

代码语言:javascript
复制
0.82000 != 0.81999999999999995115018691649311222136020660400390625

请参见方法的文档

根据该方法,两个BigDecimal对象(如2.02.00)在值中相等,但具有不同的标度(如2.02.00)。..。

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

https://stackoverflow.com/questions/50847683

复制
相关文章

相似问题

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