Java中的货币精度(不是BigDecimal)

时间:2015-02-03 16:57:06

标签: java floating-point precision currency

我们知道使用float或double不是需要正确精度的选项,我们知道BigDecimal可以达到这个目的,但我们也知道它比常规基元操作慢100倍。

如果速度对我们来说至关重要,我们该怎么做?我们确实需要精确度?

我试图将货币的价值存储在最慢的单位并存储其转换,如1 BTC = 100000000 satoshi但经过几次实验后很明显,您只是无法存储100BTC,超过最大可能值。是的,有一种选择可以牺牲精确度,比如存储microBTC等等,但问题更全局,我们如何用基元设计这样的东西?

2 个答案:

答案 0 :(得分:5)

正如D.E.Knuth在他的第2卷“计算机程序设计的艺术”中所充分记录的那样。以任意精度实现算术不是黑色艺术" - 参见章节" Seminumerical Algorithms"。我已经完成了这项工作,遵循了实施COBOL计算的必要性(所以:不仅仅是整数)。

此外,如果不为每个新的op结果重新创建对象,则可以选择BigInteger或BigDecimal。是的,这意味着工作,但如果你真的认为你需要它......

我发现,就算术而言,BigInteger并不是那么慢。真正为我使用它的原因是必须频繁地在二进制和十进制(十进制数组之间)之间进行转换。

答案 1 :(得分:1)

您的选择是:

BigDecimal - 准确有效 - 比原语慢,但可能没有可测量的 - 大多数是不可变的(即可以改变准确性而不是价值)。

long - 准确但有价值限制 - 原始因此不能为速度而牺牲 - 不可变 - 数学更容易和更清晰地写。

BigInteger - 可能是你在上面之间最好的中途 - 不可改变,所以你必须在改变价值时制作新的 - 你不太可能达到它的极限。