BigDecimal 在 Java 里并不是“任意精度整数”,而是任意精度的十进制数(可以包含小数位)。
如果你说的是任意精度整数,那通常是 BigInteger。不过很多场景下大家会混在一起问,所以我分开说明,并重点讲 什么时候用 BigDecimal / BigInteger。
| 类型 | 是否任意精度 | 是否支持小数 | 典型用途 |
|---|---|---|---|
int / long |
❌ 固定 | ❌ | 普通计数 |
BigInteger |
✅ 任意精度 | ❌ | 超大整数 |
BigDecimal |
✅ 任意精度 | ✅ | 高精度金额、金融计算 |
BigDecimal(任意精度十进制)绝对不要用 double / float
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004 ❌
✅ 正确做法:
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b); // 0.3 ✅
适用场景:
例如:
BigDecimal 可以精确控制:
BigDecimal result = value.setScale(2, RoundingMode.HALF_UP);
double 是二进制浮点,天然不精确。
适合用 BigDecimal:
if (amount.compareTo(BigDecimal.ZERO) == 0) { ... }
而不是:
if (amount == 0.0) ❌
❌ 性能敏感场景
❌ 只需要近似值的场景
BigInteger(任意精度整数)long 范围BigInteger a = new BigInteger("9999999999999999999999999999");
✅ 涉及钱、金额、金融、精度不能出错 →
BigDecimal
✅ 整数巨大或密码学 →BigInteger
❌ 普通业务、高性能计算 → 不用它们
如果你愿意,我可以帮你:
BigDecimal 还是 longBigDecimal("0.1") 和 BigDecimal.valueOf(0.1) 的区别免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。