BigDecimal和BigInteger的性能比较

9

我在思考是使用BigDecimal和BigInteger还是仅使用BigDecimal来使我的生活更轻松,减少来回转换。仅使用BigDecimal是否存在资源方面的缺陷?

如果只使用原始数据类型和BigInteger或仅使用BigInteger,对于使我的生活更轻松,减少来回转换有何作用呢?


3
你想要做什么? - Joban
1
我正在进行一系列大数和小数之间的计算,包括十进制和非十进制数。 - dalawh
1
在这种情况下,请仅使用BigDecimal。请记住,不断更改类型也会产生开销... - le3th4x0rbot
使用原始数据类型和BigInteger或仅使用BigInteger会让我的生活更轻松,减少来回转换的麻烦,您觉得怎么样? - dalawh
如果您只有整数,并且只想要整数结果(在数字领域的意义上),那么您应该使用BigInteger而不是BigDecimal。 要对BigInteger执行算术运算,必须提供BigIntegers,因此在原始类型中保持值并没有太多作用,除非您真的在大数部分之前使用它们做了其他事情。 - le3th4x0rbot
顺便提一下,BigInteger和BigDecimal都非常好地实现了。为确保该类既快速又内存高效,付出了巨大的努力。如果数字是32位,则使用BigInteger进行数学运算的速度几乎与Integer相同,这一点真的不会让我感到惊讶。 - le3th4x0rbot
4个回答

14

来源: http://www.javamex.com/tutorials/math/BigDecimal_BigInteger_performance.shtml

请注意,BigDecimal实际上是一个围绕着BigInteger包装的类,它“记住了小数点的位置”。

由于我们习惯使用数字作为人类,在手动计算非整数时,可能需要“多思考一些”,相比之下计算整数时可能会更快捷(例如,我们可能已经熟记了7乘法口诀表以加速某些计算,但可能没有学过0.7乘法口诀表)。但对于计算机实现来说,操作非整数与操作整数基本上同样轻松,因此在整体上,BigDecimal上的方法往往与BigInteger上的类似方法执行效率相当。


还有一个舍入行为是针对操作结果产生无理数并且会一直保持缓冲区填充状态的情况所指定的! - le3th4x0rbot
只使用基本数据类型和BigInteger,或者仅使用BigInteger,会让我的生活更轻松,减少来回转换的烦恼,你觉得怎么样? - dalawh
1
与加法和减法不同的是,执行乘法所需的时间随着乘数位数呈指数级增长:更具体地说,将具有n个数字的数字乘以具有m个数字的数字大约需要nm的时间。这并不是“指数级增长”的意思... - tmyklebu

3
我知道你的问题标题是“BigDecimal与BigInteger和BigDecimal的性能比较”,但你的一个问题是“仅使用原始数据类型和BigInteger或仅使用BigInteger来制作”。那么这就是我建议的:
如果您需要准确性、精度,并且您要处理大量的数字,例如大型金融数据,则最好使用BigDecimal和BigInteger而不是原始类型。 BigDecimal和BigInteger的其他特点还包括:
1.它们都是不可变对象。
2.它们都扩展自Number类并实现了Comparable接口。
现在回到你的主要问题,在性能方面,两者之间没有太大的区别。如果您可以使用BigDecimal来呈现您的信息,那么请使用它,这样您就不必将其转换为BigInteger,但是再次查看程序,看看是否有意义始终只使用BigDecimal。
BigInteger和BigDecimal之间的主要区别在于BigInteger支持任意精度整数,而BigDecimal用于任意精度定点数。
以下是我的来源,祝你好运:)

纽约大学

科罗拉多大学


我想我会坚持使用BigDecimal。起初,我在考虑是只使用BigDecimal/BigInteger还是同时使用它们和原始类型,因为我不确定在一些计算后将Bigs强制转换为原始类型是否会影响它们的大小。这有点令人困惑,但是谢谢你的帮助。 - dalawh
非常好的解释:请将这行加粗 - BigInteger 和 BigDecimal 的主要区别在于 BigInteger 支持任意精度整数,而 BigDecimal 用于任意精度定点数。 - Onic Team
1
什么是任意精度定点数? - MouseNag

0

如果您正在开发一个低延迟的应用程序,每微秒都很重要,那么BigDecimal/BigInteger并不适合您。除此之外,BigDecimal/BigInteger没有任何显著影响。

BigDecimal的性能比longdouble要低。同样的情况也适用于BigInteger及其对应的原始类型。


0

如果你很担心在处理大数时的性能问题,我建议你避免使用 Java 的 BigIntegerBigDecimal,因为它们的算法(无论是渐进还是在相当小的输入下)在乘法、除法和基数转换方面都非常慢。如果你发现它成为了瓶颈,你没有办法用更有效的算法来替换它们,除非编写与 BigInteger 兼容的大数类并进行重构。

如果你要处理大整数,最好使用一个 Java 封装的 GMP 和 MPFR,因为由于 Java 调用本地方法的原因,“大” 在这里可能是几百位数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接