BigDecimal用法示例
文章目录
BigDecimal 是 Java 中用于高精度数值计算的类,尤其适合金融和货币计算,避免了浮点数的精度误差。下面是 BigDecimal 进行加减乘除的基本用法和注意事项。
1. 加法:add
java
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");
BigDecimal result = a.add(b); // 10.5 + 2.3 = 12.8
2. 减法:subtract
java
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");
BigDecimal result = a.subtract(b); // 10.5 - 2.3 = 8.2
3. 乘法:multiply
java
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("2.3");
BigDecimal result = a.multiply(b); // 10.5 * 2.3 = 24.15
4. 除法:divide
除法是 BigDecimal 的难点,因为除法有可能会产生无限循环小数,需要指定舍入模式和精度。
java
javaBigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3");
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 保留2位小数,四舍五入
// 10.5 / 3 = 3.50
说明:
- 第二个参数
2是保留的小数位数(scale) - 第三个参数是舍入模式,比如常用的:
RoundingMode.HALF_UP--- 四舍五入RoundingMode.DOWN--- 直接截断RoundingMode.HALF_EVEN--- 银行家舍入法
5. 小数位数控制:setScale
可以对结果进行小数位数的控制和舍入:
java
javaBigDecimal value = new BigDecimal("12.34567");
// 保留两位小数,四舍五入
BigDecimal scaledValue = value.setScale(2, RoundingMode.HALF_UP); // 12.35
6. 注意事项
-
BigDecimal的构造建议传入字符串或long/double的valueOf,避免直接用new BigDecimal(double)因为可能带来精度误差:javajavanew BigDecimal("0.1"); // 推荐 BigDecimal.valueOf(0.1); // 推荐 new BigDecimal(0.1); // 不推荐,可能得到0.10000000000000000555 -
BigDecimal对象是不可变的,所有操作都会返回一个新的BigDecimal,原对象不变。
总结示例
java
javaimport java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.5");
BigDecimal b = new BigDecimal("3");
BigDecimal sum = a.add(b);
BigDecimal diff = a.subtract(b);
BigDecimal mul = a.multiply(b);
BigDecimal div = a.divide(b, 2, RoundingMode.HALF_UP);
System.out.println("加法: " + sum); // 13.0
System.out.println("减法: " + diff); // 7.5
System.out.println("乘法: " + mul); // 31.5
System.out.println("除法: " + div); // 3.50
double amount = mallProcureOrderDetailBOList.stream()
.map(record ->
BigDecimal.valueOf(record.getCommodityPrice()).multiply(BigDecimal.valueOf(record.getQuantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(2, RoundingMode.HALF_UP).doubleValue();
System.out.println("java8 stream 加法: " + amount);
}
}