【发布时间】: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