4

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

我一遍又一遍地读到,在 Java 中表示货币的一种快速且快速的方法是使用 long 存储美分(或任何所需的精度)。正如其中一条评论指出的那样,有一些带有包装器的库可以做到这一点,例如来自 JavaMoney 的FastMoney

这里有两个问题。

  1. 将钱长期存放(或包装内)并将其他所有内容(例如汇率)加倍存放是否总是安全的换句话说,如果我这样做Math.round(money * rate)(钱是美分,汇率是双倍),我会不会遇到与所有东西都翻倍的基本相同的问题?

  2. FastMoney 和许多其他库仅支持它们与原始类型之间的操作。profit.divide(investment)如果我做不到(两者都是 FastMoney),我应该如何准确表示投资回报。我想我的想法是我将两者都转换为双打然后将它们分开,但这不准确吗?

4

1 回答 1

4

您正在寻找的功能已经在 J​​avaMoney 库中实现。

它有一个 FastMoney 类,可以执行long您所要求的算术运算。

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

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

另请注意,这与long算术计算中的精度损失不同,这是由于小数部分未存储在 long 中。这可以在实施过程中通过将小数部分移动到另一个多头(例如 1.05 -> 1 美元和 5 美分)来防止。

参考

  1. 快速教程

  2. 项目网站

于 2018-05-28T07:21:04.413 回答