如何处理 Java BigDecimal 的性能?

2022-08-31 15:38:59

我为生活编写货币交易应用程序,所以我必须使用货币值(很遗憾Java仍然没有十进制浮点数类型,也没有任何东西支持任意精确的货币计算)。“使用BigDecimal!”——你可能会说。我愿意。但是现在我有一些代码,其中性能一个问题,BigDecimal比基元慢1000倍(!)以上。double

计算非常简单:系统所做的是计算许多次(其中,并且是定点值)。但是,问题在于 这一点 。我不能使用不动点算术,因为没有不动点。而且不仅丑陋,而且缓慢而缓慢。a = (1/b) * cabc(1/b)BigDecimal result = a.multiply(BigDecimal.ONE.divide(b).multiply(c)

我可以使用什么来替换 BigDecimal?我需要至少将性能提高 10 倍。我发现了其他优秀的JScience库,它具有任意精度的算术,但它甚至比BigDecimal慢。

有什么建议吗?


答案 1

也许你应该从用a = c / b替换a = (1 / b)* c开始?它不是10倍,但仍然是一些东西。

如果我是你,我会创建我自己的类钱,它会保留多头美元和多头美分,并在其中做数学运算。


答案 2

大多数双重运算可以为您提供足够的精度。您可以用加倍的精度表示10万亿美元,这对你来说可能绰绰有余。

在我研究过的所有交易系统(四个不同的银行)中,他们都使用具有适当舍入的双倍。我看不出有任何理由使用BigDecimal。


推荐