在 Java 里,BigDecimal 不是“任意精度整数”,它是任意精度的十进制浮点数(有 unscaled value + scale)。如果你想要任意精度整数,应该用 BigInteger。
下面分两部分说:用 BigDecimal 做“整数运算”如何避免坑,以及什么时候该用 BigInteger。
new BigDecimal(double)BigDecimal a = new BigDecimal(0.1); // 错误
结果不是 0.1,而是:
0.1000000000000000055511151231257827021181583404541015625
✅ 正确做法:
BigDecimal a = BigDecimal.valueOf(0.1);
// 或
BigDecimal a = new BigDecimal("0.1");
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
a.divide(b); // ❌ 会抛 ArithmeticException
✅ 正确:
a.divide(b, 10, RoundingMode.HALF_UP);
如果你只想做整数除法:
a.divideToIntegralValue(b)
equalsBigDecimal.valueOf(1.0).equals(BigDecimal.valueOf(1.00)) // false
因为:
1.0 → scale=11.00 → scale=2✅ 用:
a.compareTo(b) == 0
如果你把 BigDecimal 当整数用:
BigDecimal a = new BigDecimal("100");
BigDecimal b = new BigDecimal("3");
a.divide(b) // ❌
✅ 明确整数语义:
a.divide(b, 0, RoundingMode.DOWN)
或者先转 BigInteger:
a.toBigIntegerExact()
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
a.add(b); // scale = 2
在循环计算时要小心,否则性能和精度都会出问题。
✅ 必要时归一化:
a.stripTrailingZeros()
BigInteger,不是 BigDecimalBigInteger a = new BigInteger("12345678901234567890123456789");
BigInteger b = new BigInteger("987654321");
BigInteger c = a.add(b);
BigInteger d = a.multiply(b);
BigInteger e = a.divide(b);
优点:
| 场景 | 用哪个 |
|---|---|
| 金额(钱) | BigDecimal |
| 整数运算 | BigInteger |
| 百分比 / 利率 | BigDecimal |
| 计数 / ID / 数学 | BigInteger |
| 精度可控的整数 | BigDecimal + scale=0 |
BigDecimal money = BigDecimal.valueOf(100.00);
BigDecimal rate = new BigDecimal("0.035");
BigDecimal result = money
.multiply(rate)
.setScale(2, RoundingMode.HALF_UP);
如果你愿意,可以告诉我:
我可以直接给你针对性写法或工具类。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。