在 Java 里,BigDecimal 的“任意精度整数”本质是用 BigInteger 存 unscaled value + 一个 scale。所谓“调优”,通常不是让 BigDecimal“更快”,而是避免不必要的开销、减少对象创建、选对用法。下面按实战角度讲。
BigDecimal ≠ 任意精度整数专用类
BigInteger
✅ 如果你只是“大整数”,直接用 BigInteger
❌ 慢 / 易出错
new BigDecimal(0.1); // 二进制误差
new BigDecimal("0.1"); // OK,但解析慢
✅ 推荐(整数场景)
BigDecimal.valueOf(long) // 内部 cache 常用值
BigDecimal.BigIntegerConstructor
✅ 如果是整数:
new BigDecimal(BigInteger.valueOf(x))
setScale / dividedivide 是最贵操作之一
❌ 错误示例
a.divide(b, 10, RoundingMode.HALF_UP);
✅ 优化建议
BigInteger ai = a.unscaledValue().multiply(TEN.pow(scale));
BigInteger bi = b.unscaledValue();
BigInteger r = ai.divide(bi);
private static final BigDecimal ZERO = BigDecimal.ZERO;
private static final BigDecimal ONE = BigDecimal.ONE;
private static final BigDecimal TEN = BigDecimal.TEN;
✅ JVM 内部有缓存(-1~10)
BigInteger a = BigInteger.valueOf(123);
BigInteger b = a.multiply(b);
优势:
BigDecimal x = BigDecimal.valueOf(123).setScale(0);
规则:
RoundingMode.UNNECESSARYx.divide(y, RoundingMode.UNNECESSARY);
long[]BigDecimal 是不可变对象:
✅ 优化手段:
BigInteger + 一次转换-XX:+UseG1GC
-XX:MaxGCPauseMillis=10
对 BigDecimal 密集型程序有效
❌ 高频科学计算
❌ 矩阵 / 加密底层
❌ 游戏 / 实时系统
✅ 用:
longBigIntegerBigDecimal 的“调优”= 不用就不用 + 用就减少对象 + 整数用 BigInteger
如果你愿意,可以告诉我:
我可以给你具体代码级优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。