在 Java 里 BigDecimal 并不是“任意精度整数”,而是任意精度的“十进制数”(可以带小数)。
如果你只想要任意精度整数,更合适的是 BigInteger。
下面分两种情况说明。
BigIntegerimport java.math.BigInteger;
BigInteger a = new BigInteger("12345678901234567890");
BigInteger b = BigInteger.valueOf(100); // 小整数推荐
BigInteger sum = a.add(b); // 加
BigInteger diff = a.subtract(b); // 减
BigInteger prod = a.multiply(b); // 乘
BigInteger quot = a.divide(b); // 除(整除)
BigInteger rem = a.remainder(b); // 取余
a.compareTo(b); // -1, 0, 1
a.equals(b); // 注意:equals 比较值
a.and(b);
a.or(b);
a.shiftLeft(1); // 乘 2
a.shiftRight(1); // 除 2
✅ 适合场景
long)BigDecimal(带小数的任意精度)double 构造)BigDecimal a = new BigDecimal("0.1"); // ✅ 推荐
BigDecimal b = BigDecimal.valueOf(0.1); // ✅ 也安全
❌ 错误示例:
BigDecimal wrong = new BigDecimal(0.1); // 精度丢失
BigDecimal sum = a.add(b);
BigDecimal diff = a.subtract(b);
BigDecimal prod = a.multiply(b);
BigDecimal quot = a.divide(b, 10, RoundingMode.HALF_UP); // ⚠️必须指定精度和舍入
⚠️ BigDecimal 除法必须指定:
否则会抛异常:
ArithmeticException: Non-terminating decimal expansion
BigDecimal r = a.setScale(2, RoundingMode.HALF_UP);
a.compareTo(b); // 推荐
a.equals(b); // 会连精度一起比较(不推荐)
BigInteger vs BigDecimal 怎么选?| 需求 | 推荐 |
|---|---|
| 任意精度整数 | ✅ BigInteger |
| 金额 / 小数 | ✅ BigDecimal |
| 位运算 | ✅ BigInteger |
| 高精度除法 | ✅ BigDecimal |
❌ BigDecimal 不是“整数”
❌ 用 double 构造 BigDecimal
❌ 忘记指定除法精度
如果你愿意,可以把具体使用场景(比如:金额计算 / 大整数运算 / 阶乘 / 精度要求)发出来,我可以直接帮你写最合适的代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。