在 Java 里,BigDecimal 本身并不是“任意精度整数”,而是 任意精度的 十进制浮点数(由 BigInteger unscaledValue + int scale 组成)。
如果你说的“任意精度整数”是指 整数运算且不丢精度,那其实是靠 BigInteger + BigDecimal 的 scale 控制 来实现的。
下面分几种常见需求说明 如何控精度。
✅ 用 BigInteger
BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = a.multiply(a);
✅ 控制 scale = 0
BigDecimal a = new BigDecimal("123456789012345678901234567890");
a = a.setScale(0, RoundingMode.UNNECESSARY);
scale = 0 表示没有小数位UNNECESSARY 会强制要求“本来就是整数”⚠️ 一旦做除法,就可能产生小数,必须指定舍入模式
BigDecimal 的“精度”来自两部分:
value = unscaledValue × 10^(-scale)
| 项目 | 说明 |
|---|---|
| unscaledValue | BigInteger,位数无限 |
| scale | 小数位数 |
| precision | 总有效位数(只读) |
new BigDecimal("123.4500").scale(); // 4
new BigDecimal("123.4500").precision(); // 6
❌ 错误(二进制浮点)
BigDecimal a = new BigDecimal(0.1); // 0.1000000000000000055...
✅ 正确
BigDecimal a = new BigDecimal("0.1");
// 或
BigDecimal a = BigDecimal.valueOf(0.1);
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);
常用舍入模式:
HALF_UP(四舍五入)DOWN(截断)UNNECESSARY(必须整除,否则报错)int SCALE = 4;
RoundingMode RM = RoundingMode.HALF_UP;
BigDecimal r = a.add(b).setScale(SCALE, RM);
✅ 用 BigInteger + 定点小数
// 金额单位:分
BigInteger cents = new BigInteger("123456");
// 转元
BigDecimal yuan = new BigDecimal(cents).movePointLeft(2);
✅ 这是金融系统最常用的“精度控制方案”
BigDecimal 没有“整数精度”概念,它只有 scale 和 rounding
- 要任意精度整数 → 用
BigInteger- 要可控小数精度 →
BigDecimal + setScale + RoundingMode- 金融场景 →
BigInteger(分) + 显示时转 BigDecimal
如果你有具体场景(金额 / 科学计算 / 除法精度),我可以给你一套标准写法模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。