gpt4 book ai didi

java - 为什么 BigDecimal 中的 0.4 和 0.40 不同?

转载 作者:行者123 更新时间:2023-12-02 03:46:47 26 4
gpt4 key购买 nike

我读到 BigDecimal 是用 Java 表示金钱的最佳方法。

但我不明白为什么我的一个单元测试失败并显示以下消息:

org.opentest4j.AssertionFailedError:   
Expected :0.40
Actual :0.4

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

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

  1. 为什么这些值不被同等对待?
  2. 如何才能将 0.40 美元表示为 BigDecimal,而不会触发此类不匹配?

最佳答案

BigDecimals 是数字和“刻度”的组合。 2 BD 不认为自己相等,除非两者相等。我建议使用 .compareTo(other) == 0) 来获取答案。

注意:我不认为使用 BD 是做货币的好方法。

通常有两种方法来处理货币。简单的方法和困难的方法。

最简单的方法是将美分存储在 intlong 中。因此,将 0.40 美元存储为 40,而像 12.50 美元这样的东西将存储为 1250。现在你有两个问题:你不能表示半美分,并且可能会发生溢出(你不能表示高于 2^31-1 美分的金额,但那是..很多美分。将其设为 而且我们远远超过了全世界的GDP)。

但是,半美分通常是一个问题。就这个问题来说:

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

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

换句话说,如果“只使用 int/long”不起作用,那么 BigDecimal 也可能不好。

关于java - 为什么 BigDecimal 中的 0.4 和 0.40 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56800063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com