Java快钱代表?

时间:2018-05-28 07:16:27

标签: java currency long-integer java-money jsr354

我正在开发一个实时应用程序,使用BigDecimal处理不同货币和汇率的货币,但我面临一些严重的性能问题,我想改变基础代表。

我一次又一次地读到,在Java中代表金钱的一种快捷方式是使用long存储美分(或任何所需的精度)。正如其中一条评论指出的那样,有些lib包含了这样的包装,例如来自JavaMoney的FastMoney。

这里有两个问题。

  1. 总是安全地存钱作为一个长期(或在包装内)并保持其他所有(如汇率)为双打?换句话说,如果我做Math.round(money * rate)(钱是美分,费率是双倍),我会遇到基本相同的问题,比如把所有东西都放在双打中吗?

  2. FastMoney和许多其他lib只支持它们和原始类型之间的操作。如果我不能做profit.divide(investment)(两者都是FastMoney),我怎么能得到准确的表示让我们说投资的回报。我想这个想法是我将两者都转换为双打然后除以它们,但这是不准确的吗?

1 个答案:

答案 0 :(得分:4)

您正在寻找的功能已经在JavaMoney库中实现。

它有一个执行long算术的FastMoney类,这正是你所要求的。

对于新Java开发人员 - 为什么要长,不要加倍?

Java中的浮点算法由于其实现而导致一些意外的精度错误。因此,不建议在财务计算中使用。

另请注意,这与long算术计算中的精度损失不同,后者是由于小数部分未存储在长整数中。通过将小数部分移动到另一个长度(例如1.05 - > 1美元和5美分),可以在实现期间防止这种情况。

<强>参考

  1. A Quick Tutorial

  2. Project Website