【问题标题】:Representing money with integers/BigInteger vs BigDecimal用整数/BigInteger vs BigDecimal 表示钱
【发布时间】:2017-05-18 16:17:36
【问题描述】:

几年前,我帮助编写了一个处理金钱和保险的应用程序。最初,我们用浮点数表示货币(我知道这是一个很大的禁忌)。大多数应用程序只是加减值,所以没有任何问题。但是,特定部分处理的是货币价值的百分比,因此是乘法和除法。

我们立即开始遭受浮点错误的困扰,不得不进行重大重构。我们使用了一个任意精度的库来解决这个问题。但是,这并没有改变您最终可能得到几分之一美分的事实。你应该怎么把它弄圆?简短的回答是“it's complicated”。

现在我准备开始开发一个类似的应用程序来取代旧的应用程序。我多年来一直在考虑这个问题。我一直认为创建一个包含整数(或BigInteger)的货币数据类型是最简单的,以表示便士的数量,并具有将其打印为传统的、人性化的$0.00 格式的函数。

然而,研究这个,我发现JSR 354,最近实现的Java Money API。我惊讶地发现它用BigDecimal 支持它的金钱表示。因此,它包含了特定的舍入逻辑。

在您的计算中携带一小部分一分钱有什么好处?我为什么要这样做而不是说一分钱是“原子”形式的货币?

【问题讨论】:

  • 因为不是。我今天购买的商品价格仅为美分。
  • 你熟悉millage rates吗?还是gasoline的价格?

标签: java currency arbitrary-precision


【解决方案1】:

这是一个宽泛的问题,因为它的答案因实施而异。

如果我以 5 美元的价格批量购买 1000 件商品,那么每件商品的单独成本为 0.005 美元,这比您声称的货币“原子形式”的 0.01 美元要低。

如果我们认为 0.01 美元是可能的最低金额,那么我们将无法处理特定情况下的计算,例如我的示例中的情况。

因此,JavaMoney API 处理许多小数位,确保在此类情况下不会丢失精度。

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多