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);
也许你过度思考这个问题并假设你需要一个库来满足一切。
如果您使用long
或double
,则可能需要使用少量辅助方法进行舍入,但是您不需要这样的库。