我已经读到,在用Java表示货币时,BigDecimal是最好的选择。
但是,我不明白为什么我的一个单元测试在以下消息中失败了:
org.opentest4j.AssertionFailedError:
Expected :0.40
Actual :0.4
“实际”值是BigDecimal.valueOf(0.398).setScale(2, RoundingMode.HALF_UP)
的结果。
所以我想我的问题有两部分:
发布于 2019-06-27 18:33:52
BigDecimals是一个数字和一个“比例”的组合。BDs不认为自己是平等的,除非两者是平等的。我建议使用.compareTo(other) == 0)
来得到答案。
注:我不认为使用BD是一个很好的方法来做货币。
通常有两种方法来接近货币。简单的方法和艰难的方法。
简单的方法是在int
或long
中存储美分。所以,将$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也不太好。
https://stackoverflow.com/questions/56800063
复制相似问题