1. BigDecimal概述
BigDecimal是Java中用于高精度计算的类,它解决了浮点数运算中的精度丢失问题。在实际开发中,金融计算、科学计算等场景对精度要求极高,使用double或float类型进行运算时经常会出现意料之外的结果。
重要提示:当涉及货币计算、税率计算等场景时,必须使用BigDecimal而非基本数据类型,否则可能造成严重的财务误差。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BigDecimal的核心特性
2.1 不可变性
BigDecimal是不可变(immutable)对象,这意味着每次运算都会生成新的对象,而非修改原有对象。这种设计带来了线程安全的特性,但也需要注意性能影响。
java复制BigDecimal a = new BigDecimal("10.5");
BigDecimal b = a.add(new BigDecimal("2.3")); // 创建新对象
System.out.println(a); // 仍为10.5
2.2 精度控制
BigDecimal通过scale(小数位数)和precision(总位数)来控制数值精度。构造BigDecimal时,推荐使用String而非double,以避免初始精度问题:
java复制// 不推荐 - 可能存在精度问题
BigDecimal bad = new BigDecimal(0.1);
// 推荐方式
BigDecimal good = new BigDecimal("0.1");
3. 创建BigDecimal的正确方式
3.1 字符串构造法
最安全的方式是通过字符串创建BigDecimal:
java复制BigDecimal exact = new BigDecimal("123.4567");
3.2 使用valueOf方法
对于double值,应使用静态valueOf方法:
java复制BigDecimal better = BigDecimal.valueOf(0.1); // 优于new BigDecimal(0.1)
3.3 避免的构造方式
直接使用double构造会导致精度问题:
java复制// 错误示例 - 实际值为0.1000
