这里的说法需要先澄清一下:BigDecimal 并不是“任意精度整数”,而是任意精度十进制数(支持小数)。
如果你说的是“任意精度整数”,那通常是指 BigInteger。
下面我分开说明,并重点讲 BigDecimal 的优势。
| 类 | 作用 |
|---|---|
BigInteger |
任意精度整数(没有小数) |
BigDecimal |
任意精度十进制数(整数 + 小数) |
所以:
✅
BigDecimal的优势 ≠ 整数优势
✅ 而是 “精确表示十进制数” 的优势
这是 BigDecimal 存在的最大理由。
System.out.println(0.1 + 0.2);
// 输出:0.30000000000000004
这是因为:
double 是 二进制浮点数BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 0.3
✅ 完全精确
金融、计费、税务系统非常依赖这一点。
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);
System.out.println(result); // 3.33
而 double:
System.out.println(10.0 / 3.0); // 3.3333333333333335
✅ BigDecimal 可以:
在以下场景中 几乎必须用 BigDecimal:
原因:
钱不能因为浮点误差“变多或变少”
BigDecimal a = new BigDecimal("999999999999999999999999999999");
BigDecimal b = a.multiply(a);
✅ 不会溢出
✅ 精度只受内存限制
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
System.out.println(a.equals(b)); // false(精度不同)
System.out.println(a.compareTo(b) == 0); // true(数值相等)
✅ 区分“数值相等”和“精度相等”
没有银弹,它也有明显缺点:
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = a.add(new BigDecimal("0.2"));
+ - * /add, subtract, multiply, dividedouble)BigDecimal 的最大优势是:用“十进制精确表示 + 可控精度 + 无浮点误差”来替代 double,尤其适合金融和金额计算。
如果你愿意,我也可以帮你:
BigDecimal vs double vs longBigDecimal 的最佳实践(比如为什么一定要用字符串构造)免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。