在 Java 里,BigDecimal 本身并不是“任意精度整数”,它内部是 unscaled integer(BigInteger)+ scale 的组合,主要用于精确十进制小数。如果你说的是任意精度整数,那核心类其实是 BigInteger。
下面从**“BigDecimal 做整数运算时的优化”和“任意精度整数的通用优化”**两个层面讲。
✅ 直接用 BigInteger,而不是 BigDecimal
BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = a.add(BigInteger.ONE);
BigInteger sum = BigInteger.ZERO;
for (int i = 0; i < n; i++) {
sum = sum.add(BigInteger.valueOf(i)); // 少量可控
}
BigInteger x = BigInteger.valueOf(123L); // 有缓存,快
比 new BigInteger("123") 快很多。
new BigInteger(String) 很慢BigDecimal a = new BigDecimal("12345678901234567890");
✅ 保持 scale = 0(整数)
不要写成:
BigDecimal a = new BigDecimal("12345678901234567890.0"); // 慢
BigDecimal result = a.divide(b, RoundingMode.DOWN);
❌ 不要:
a.divide(b); // 可能抛 ArithmeticException
BigDecimal x = BigDecimal.valueOf(123456L);
valueOf 内部有缓存(0–10),且对 double 更安全。
❌ 慢:
BigDecimal x = new BigDecimal(0.1); // 二进制误差
✅ 快 & 准:
BigDecimal x = new BigDecimal("0.1");
✅ 优化策略:
BigDecimal inv = BigDecimal.ONE.divide(denom, scale, RoundingMode.HALF_UP);
result = numerator.multiply(inv);
如果只是整数:
org.apache.commons.math3.util.BigRealJScienceGuava 不解决性能问题❌ 性能敏感的热点循环
✅ 替代方案:
long(够用就别上大数)int128(C++ / JNI)“任意精度整数”用 BigInteger;BigDecimal 只用于精确小数;两者都慢,优化核心是:少 new、少字符串、少除法、保持 scale 简单。
如果你愿意,可以贴一段具体代码或场景(比如:阶乘、精度计算、金融、加密),我可以给你针对性优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。