1. 创建 BigDecimal 实例
- 从字符串创建:推荐使用字符串创建
BigDecimal
实例,因为这样可以精确控制数值,避免精度丢失。
BigDecimal bd = new BigDecimal("123.456");
- 从 double 创建:虽然可以从
double
创建,但不建议这样做,因为double
本身可能就不精确。
BigDecimal bd = new BigDecimal(123.456); // 可能会因为double的精度问题导致不精确
2. 加减乘除
- 加法:
BigDecimal bd1 = new BigDecimal("10.00");
BigDecimal bd2 = new BigDecimal("5.00");
BigDecimal sum = bd1.add(bd2); // 结果为 15.00
- 减法:
BigDecimal difference = bd1.subtract(bd2); // 结果为 5.00
- 乘法:
BigDecimal bd3 = new BigDecimal("2.00");
BigDecimal product = bd1.multiply(bd3); // 结果为 20.00
- 除法:
- 精确除法(保留小数位数):
BigDecimal quotient = bd1.divide(bd2, 2, RoundingMode.HALF_UP); // 结果为 2.00,保留两位小数,四舍五入
- 注意 :除法时如果不指定精度和舍入模式,可能会抛出
ArithmeticException
异常。
3. 精度和舍入模式
- 在进行除法、平方根等运算时,需要指定精度和舍入模式以避免异常。
- 舍入模式(
RoundingMode
):HALF_UP
(四舍五入)、DOWN
(向下舍入)、UP
(向上舍入)、HALF_DOWN
(五舍六入)、CEILING
(向正无穷方向舍入)、FLOOR
(向负无穷方向舍入)等。
4. 比较
由于 BigDecimal
是不可变的,因此比较大小使用 compareTo
方法,而不是 ==
。
int result = bd1.compareTo(bd2);
if (result == 0) {
System.out.println("相等");
} else if (result > 0) {
System.out.println("bd1 大于 bd2");
} else {
System.out.println("bd1 小于 bd2");
}
5. 转换为其他类型
- 转换为字符串:
bd.toString()
- 转换为 double:
bd.doubleValue()
(注意精度可能丢失) - 转换为 int:需要确定
BigDecimal
的值确实是一个整数,并且不会溢出,然后可以使用intValueExact()
(如果确定值在 int 范围内)或intValue()
(可能丢失精度)。
6. 格式化输出
- 使用
DecimalFormat
类可以对BigDecimal
进行格式化输出。
DecimalFormat df = new DecimalFormat("#.00");
String formattedString = df.format(bd);
7. 注意事项
- 避免使用
BigDecimal
的equals
方法来比较两个值是否相等,因为精度问题可能导致预期之外的结果。使用compareTo
方法代替。 - 在进行除法运算时,务必指定精度和舍入模式,以避免
ArithmeticException
异常。 - 尽可能使用字符串来初始化
BigDecimal
对象,以保证精度。