首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有快速性能的java中的定点运算

具有快速性能的java中的定点运算
EN

Stack Overflow用户
提问于 2012-08-12 01:54:54
回答 4查看 16.3K关注 0票数 6

我需要在Java中以完美的精度和小数点后固定数量的小数点表示一些数字;在小数点之后,我并不关心。(更具体地说--金钱和百分比。)

我现在使用的是Java自己的BigDecimal,但我发现,它的真的很慢,并且它开始在我的应用程序中显示出来。

所以我想用一个“正则”整数和一个定点算法来解决这个问题(对于我的目的来说,长整数有足够的精度)。

现在,我想我不是第一个有这种问题的人,而且已经有了一个库,已经实现了乘法/除法--但似乎不是。

现在,我很可能会自己写它(我可能会写),但说真的,我真的是第一个需要它的人吗?不是已经有相应的库了吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-12 02:13:10

您完全确定BigDecimal是性能问题吗?你有没有用侧写器找出来?如果是,有两个选项可能会有帮助:

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

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

在许多情况下,使用double不是一个好的选择,因为存在舍入和精度问题。

票数 6
EN

Stack Overflow用户

发布于 2015-11-07 06:00:20

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

披露:我参与了decimal4j项目。

票数 9
EN

Stack Overflow用户

发布于 2018-10-15 07:27:32

尽管这不完全是您想要的,但这可以在不离开BigDecimal的情况下提高您的应用程序速度

从Java8开始,这个问题就由BigDecimal自己解决了。添加了一个new class MathContext,它限制了运算的计算精度。

代码语言:javascript
复制
var num = new BigDecimal("1234.56780", new MathContext(10, RoundingMode.DOWN));

问题是精度10不适用于小数点后的数字。它适用于有效位数。对于1234.50,需要6。

对于1_500_000_000.100,需要13才能保持数字不变。

因此,当你的精度为10,并计算了数十亿捷克克朗时,精度可能会受到影响。

尽管如此,比如说1000的精度,比无限精度(我认为这是默认的)要快得多。

这也可以应用于各个操作:

代码语言:javascript
复制
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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11916308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档