在 Java 里,BigDecimal 本身并不是“任意精度整数”类型,它是任意精度的十进制浮点数(带标度 scale)。如果你想要“任意精度整数”,更准确地说,应该使用 BigInteger;而 BigDecimal 只是可以“用来表示”任意精度整数(当 scale=0 时)。
下面分几种情况说明。
✅ 正确选择:BigInteger
import java.math.BigInteger;
BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = new BigInteger("98765432109876543210");
BigInteger sum = a.add(b);
BigInteger prod = a.multiply(b);
特点:
BigDecimal 可以当作整数用,只要 scale = 0(即没有小数位)。
import java.math.BigDecimal;
BigDecimal a = new BigDecimal("123456789012345678901234567890");
✅ 字符串构造 不会丢精度
❌ 不要用 new BigDecimal(0.1)(二进制浮点误差)
BigDecimal a = new BigDecimal("123.456");
BigDecimal b = a.setScale(0, RoundingMode.DOWN); // 123
BigDecimal x = new BigDecimal("100000000000000000000");
BigDecimal y = new BigDecimal("3");
BigDecimal result = x.multiply(y); // 仍然是整数
⚠️ 除法要小心:
x.divide(y); // ❌ 可能抛 ArithmeticException
x.divide(y, RoundingMode.DOWN); // ✅
| 特性 | BigInteger | BigDecimal |
|---|---|---|
| 是否整数 | ✅ 是 | ❌ 可有小数 |
| 标度(scale) | 无 | 有 |
| 适合场景 | 整数大数 | 金额、精确小数 |
| 性能 | 更快 | 稍慢 |
| 除法 | 整除/取模 | 可控制小数位 |
new BigDecimal(0.1) // ❌ 0.10000000000000000555...
✅ 正确:
new BigDecimal("0.1")
BigIntegerBigDecimalscale=0如果你愿意,我可以:
你更关心哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。