java中的定点算术,性能快

我需要在Java中用完美的精度和小数点后固定的小数点数来表示一些数字; 小数点后,我不在乎。 (更具体地说 – 金钱和百分比。)

我现在使用Java自己的BigDecimal,但我发现它非常慢并且它开始在我的应用程序中显示。

所以我想用“常规”整数和定点算术来解决它(长整数对于我的目的具有足够大的精度)。

现在,我认为我不是第一个遇到这种问题的人,而且已经有了一个库,已经实现了乘法/除法 – 但似乎并非如此。

现在,我很可能自己写(我可能会),但是,我真的是第一个需要这个的人吗? 是不是已经有一些图书馆?

完全确定BigDecimal是性能问题吗? 您是否使用了分析器来查找? 如果是,可以帮助的两个选项是:

1)使用long并将所有值乘以一个因子(例如,如果您对分数感兴趣,则为100)。

2)使用一个特殊设计的类来实现类似于BigDecimal东西,但在内部使用long 。 我不知道是否存在一个好的开源库(也许是Java Math Fixed Point Library ?)。 我很久以前(2001年我相信)为J2ME写了一篇这样的课程。 做对了有点棘手。 请注意,除非需要高精度,否则BigDecimal也会在内部使用long ,因此这种解决方案在大多数情况下只会有所帮助。

由于四舍五入和精度问题,在许多情况下使用double不是一个好选择。

decimal4j是一个基于long的快速固定精度算术的Java库,支持最多18个小数位。

免责声明:我参与了decimal4j项目。

不知道为什么你需要一个库。

例如,假设您要添加两个具有相同固定精度的long

 long c = a + b; 

假设您有一个固定的精度数,您想要一个整数倍

 long c = a * i; 

假设您要将数字除以舍入为零的整数

 long c = a / i; 

假设您要打印带有3位小数的固定精度数字。

 System.out.println(c / 1e3); 

也许你过度思考这个问题并假设你需要一个库来满足一切。

如果您使用longdouble ,则可能需要使用少量辅助方法进行舍入,但是您不需要这样的库。