首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么0.4和0.40与BigDecimal不同?

为什么0.4和0.40与BigDecimal不同?
EN

Stack Overflow用户
提问于 2019-06-27 17:47:11
回答 1查看 274关注 0票数 0

我已经读到,在用Java表示货币时,BigDecimal是最好的选择。

但是,我不明白为什么我的一个单元测试在以下消息中失败了:

代码语言:javascript
运行
AI代码解释
复制
org.opentest4j.AssertionFailedError:   
Expected :0.40  
Actual   :0.4

“实际”值是BigDecimal.valueOf(0.398).setScale(2, RoundingMode.HALF_UP)的结果。

所以我想我的问题有两部分:

  1. 为什么这些价值观不被平等对待?
  2. 我如何以不触发这种不匹配的方式将$0.40表示为BigDecimal?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-27 18:33:52

BigDecimals是一个数字和一个“比例”的组合。BDs不认为自己是平等的,除非两者是平等的。我建议使用.compareTo(other) == 0)来得到答案。

注:我不认为使用BD是一个很好的方法来做货币。

通常有两种方法来接近货币。简单的方法和艰难的方法。

简单的方法是在intlong中存储美分。所以,将$0.40存储为简单的40,像$12.50这样的存储将以1250的形式存储。你现在有两个问题:你不能代表半美分,而且可能会发生溢出(你不能代表高于2^31-1美分的金额,但那是.很多钱。让它成为long,我们已经远远超过了整个世界的GDP )。

但是,一般情况下,半分钱是个问题。关于这个问题:

我有4美分。我想把这些分给3个人。

那我们该怎么办?BigDecimal在这里帮不了你;你不能用完美的BD表示4除以3。YOu必须绕到某个地方(1.33333333.BD不能表示无限序列)。即使它可以,或者你决定以惊人的数量(比如说200位数),现在怎么办?你不能告诉你的银行转三分之一的钱。没有简单的答案:如果这是你的应用程序需要做的,那么你需要决定如何处理这个问题。例如,“剩下的钱是给房子用的”或者“软件会随机挑选一个收件人,他们得到2美分,另外2美分得到一分)。”

换句话说,如果‘只使用int/long’不能做到这一点,那么BigDecimal也不太好。

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

https://stackoverflow.com/questions/56800063

复制
相关文章

相似问题

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