我需要在Java中以完美的精度和小数点后固定数量的小数点表示一些数字;在小数点之后,我并不关心。(更具体地说--金钱和百分比。)
我现在使用的是Java自己的BigDecimal,但我发现,它的真的很慢,并且它开始在我的应用程序中显示出来。
所以我想用一个“正则”整数和一个定点算法来解决这个问题(对于我的目的来说,长整数有足够的精度)。
现在,我想我不是第一个有这种问题的人,而且已经有了一个库,已经实现了乘法/除法--但似乎不是。
现在,我很可能会自己写它(我可能会写),但说真的,我真的是第一个需要它的人吗?不是已经有相应的库了吗?
发布于 2012-08-12 02:13:10
您完全确定BigDecimal是性能问题吗?你有没有用侧写器找出来?如果是,有两个选项可能会有帮助:
1)使用long
,将所有值乘以一个因子(例如,如果您对美分感兴趣,则为100 )。
2)使用专门设计的类来实现类似于BigDecimal
的东西,但在内部使用long
。我不知道是否存在一个好的开源库(也许是Java Math Fixed Point Library?)。我自己在很久以前(我相信是2001年)为J2ME编写了一个这样的类。这是一个有点棘手的问题。请注意,除非需要高精度,否则BigDecimal
也在内部使用long
,因此这种解决方案在大多数情况下只会有很小的帮助。
在许多情况下,使用double
不是一个好的选择,因为存在舍入和精度问题。
发布于 2015-11-07 06:00:20
decimal4j是一个Java库,用于基于长整型的快速固定精度算术,支持最多18位小数。
披露:我参与了decimal4j项目。
发布于 2018-10-15 07:27:32
尽管这不完全是您想要的,但这可以在不离开BigDecimal
的情况下提高您的应用程序速度
从Java8开始,这个问题就由BigDecimal
自己解决了。添加了一个new class MathContext
,它限制了运算的计算精度。
var num = new BigDecimal("1234.56780", new MathContext(10, RoundingMode.DOWN));
问题是精度10
不适用于小数点后的数字。它适用于有效位数。对于1234.50
,需要6。
对于1_500_000_000.100
,需要13才能保持数字不变。
因此,当你的精度为10,并计算了数十亿捷克克朗时,精度可能会受到影响。
尽管如此,比如说1000的精度,比无限精度(我认为这是默认的)要快得多。
这也可以应用于各个操作:
BigDecimal n = new BigDecimal("0.12345");
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
https://stackoverflow.com/questions/11916308
复制相似问题