我在思考是使用BigDecimal和BigInteger还是仅使用BigDecimal来使我的生活更轻松,减少来回转换。仅使用BigDecimal是否存在资源方面的缺陷?
如果只使用原始数据类型和BigInteger或仅使用BigInteger,对于使我的生活更轻松,减少来回转换有何作用呢?
我在思考是使用BigDecimal和BigInteger还是仅使用BigDecimal来使我的生活更轻松,减少来回转换。仅使用BigDecimal是否存在资源方面的缺陷?
如果只使用原始数据类型和BigInteger或仅使用BigInteger,对于使我的生活更轻松,减少来回转换有何作用呢?
来源: http://www.javamex.com/tutorials/math/BigDecimal_BigInteger_performance.shtml
请注意,BigDecimal实际上是一个围绕着BigInteger包装的类,它“记住了小数点的位置”。
由于我们习惯使用数字作为人类,在手动计算非整数时,可能需要“多思考一些”,相比之下计算整数时可能会更快捷(例如,我们可能已经熟记了7乘法口诀表以加速某些计算,但可能没有学过0.7乘法口诀表)。但对于计算机实现来说,操作非整数与操作整数基本上同样轻松,因此在整体上,BigDecimal上的方法往往与BigInteger上的类似方法执行效率相当。
如果您正在开发一个低延迟的应用程序,每微秒都很重要,那么BigDecimal/BigInteger并不适合您。除此之外,BigDecimal/BigInteger没有任何显著影响。
BigDecimal的性能比long
、double
要低。同样的情况也适用于BigInteger及其对应的原始类型。
如果你很担心在处理大数时的性能问题,我建议你避免使用 Java 的 BigInteger
和 BigDecimal
,因为它们的算法(无论是渐进还是在相当小的输入下)在乘法、除法和基数转换方面都非常慢。如果你发现它成为了瓶颈,你没有办法用更有效的算法来替换它们,除非编写与 BigInteger
兼容的大数类并进行重构。
如果你要处理大整数,最好使用一个 Java 封装的 GMP 和 MPFR,因为由于 Java 调用本地方法的原因,“大” 在这里可能是几百位数。