在 Java 里用 BigDecimal 处理“任意精度整数”(或高精度数值)时,所谓“出错”通常来自 精度丢失、舍入错误、比较错误、构造方式不当 等。下面按常见坑和正确做法说明。
BigDecimal a = new BigDecimal(0.1);
0.1 在 double 中本就不精确,BigDecimal 会把这种误差原样保留。
BigDecimal a = new BigDecimal("0.1");
或
BigDecimal a = BigDecimal.valueOf(0.1);
valueOf内部使用Double.toString,比new BigDecimal(double)安全。
BigInteger如果你明确是任意精度整数:
BigInteger x = new BigInteger("123456789012345678901234567890");
BigInteger 不会涉及小数、舍入问题,最安全。
只有在需要小数时才用 BigDecimal。
BigDecimal r = a.divide(b);
当不能整除时直接抛:
ArithmeticException: Non-terminating decimal expansion
BigDecimal r = a.divide(b, 10, RoundingMode.HALF_UP);
常用舍入模式:
RoundingMode.HALF_UP(四舍五入)RoundingMode.DOWNRoundingMode.UNNECESSARY(要求必须整除)equalsa.equals(b)
equals 会比较标度(scale):
new BigDecimal("1.0").equals(new BigDecimal("1.00")) // false
a.compareTo(b) == 0
BigDecimal v = a.setScale(2, RoundingMode.HALF_UP);
BigDecimal v = a.round(new MathContext(10));
double 计算后再转 BigDecimaldivide 而不设精度BigDecimal("0.00") 表示钱long / BigInteger)BigDecimal price = new BigDecimal("19.99");
BigDecimal qty = new BigDecimal("3");
BigDecimal total = price.multiply(qty)
.setScale(2, RoundingMode.HALF_UP);
✅ 用字符串或 valueOf 构造
✅ 整数用 BigInteger
✅ 除法必须指定 scale + RoundingMode
✅ 比较用 compareTo
✅ 金额用 setScale(2, HALF_UP)
如果你有具体场景(比如:银行金额、大数阶乘、分布式计算、JSON 传输),我可以给更针对性的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。