我正在开发一个实时应用程序,使用BigDecimal处理不同货币和汇率的货币,但我面临一些严重的性能问题,我想改变基础代表。
我一次又一次地读到,在Java中代表金钱的一种快捷方式是使用long存储美分(或任何所需的精度)。正如其中一条评论指出的那样,有些lib包含了这样的包装,例如来自JavaMoney的FastMoney。
这里有两个问题。
总是安全地存钱作为一个长期(或在包装内)并保持其他所有(如汇率)为双打?换句话说,如果我做Math.round(money * rate)
(钱是美分,费率是双倍),我会遇到基本相同的问题,比如把所有东西都放在双打中吗?
FastMoney和许多其他lib只支持它们和原始类型之间的操作。如果我不能做profit.divide(investment)
(两者都是FastMoney),我怎么能得到准确的表示让我们说投资的回报。我想这个想法是我将两者都转换为双打然后除以它们,但这是不准确的吗?
答案 0 :(得分:4)
您正在寻找的功能已经在JavaMoney库中实现。
它有一个执行long
算术的FastMoney类,这正是你所要求的。
对于新Java开发人员 - 为什么要长,不要加倍?
Java中的浮点算法由于其实现而导致一些意外的精度错误。因此,不建议在财务计算中使用。
另请注意,这与long
算术计算中的精度损失不同,后者是由于小数部分未存储在长整数中。通过将小数部分移动到另一个长度(例如1.05 - > 1美元和5美分),可以在实现期间防止这种情况。
<强>参考强>