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