Java快钱代表?

问题描述 投票:3回答:1

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

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

这里有两个问题。

  1. 将钱存入长期(或包装内)是否总是安全的,并将其他所有内容(如汇率)保持为双倍?换句话说,如果我做Math.round(money * rate)(钱是美分和费率是双倍),我是否会遇到基本相同的问题:拥有双打的所有内容?
  2. FastMoney和许多其他lib只支持它们和原始类型之间的操作。如果我不能做profit.divide(investment)(两者都是FastMoney),我怎么能得到一个准确的表示,让我们说投资的回报。我想这个想法是我将两者都转换为双打然后除以它们,但这是不准确的吗?
java currency long-integer java-money jsr354
1个回答
4
投票

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

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

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

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

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

参考

  1. A Quick Tutorial
  2. Project Website
© www.soinside.com 2019 - 2024. All rights reserved.