在Java开发中,涉及金额计算时,你是否还在使用double或float?
如果是,那你可能已经掉进了精度丢失的陷阱!
当支付系统因0.01元误差被用户投诉,
当促销活动出现99.999999元的天价订单…
这可能是你用错了小数点!
今天我们就来深入探讨Java中处理金额的"神器"——BigDecimal。
1. 为什么不能用double/float?
很多新手会问:"为什么不能用double或float存储金额?"答案很简单:精度丢失!
看到没?这就是浮点数计算的陷阱!在金融系统中,这种微小误差累积可能导致重大损失。
二进制浮点数的精度丢失就像"海绵里的水",永远挤不干净
为什么用BigDecimal?
金额计算必须精确,避免精度丢失! 当然我看到也有小伙伴用Long的,可以自行去了解,使用Long的好处和缺点。
double和float采用的是二进制浮点存储方式,在某些情况下可能无法精确表示小数,导致金额计算出现误差。正确做法:
Java中金额计算,使用 java.math.BigDecimal
数据库存储金额,使用 DECIMAL 类型
推荐的数据库字段定义如下:
amount DECIMAL(10,2) DEFAULT 0.00 NOT NULL COMMENT '金额'
✅ 小数点后保留两位 ✅ 默认值0.00,避免NULL带来的转换问题
BigDecimal的加减乘除
BigDecimal提供了丰富的数学运算方法,保证精度无损。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal x = new BigDecimal("1.3");
BigDecimal y = new BigDecimal("2.5");
// 加法 1.3 + 2.5 = 3.8
System.out.println("加法: " + x.add(y));
// 减法 1.3 - 2.5 = -1.2
System.out.println("减法: " + x.subtract(y));
// 乘法 1.3 * 2.5 = 3.25
System.out.println("乘法: " + x.multiply(y));
// 除法 1.3 / 2.5,四舍五入保留2位小数
System.out.println("除法: " + x.divide(y, 2, RoundingMode.HALF_UP));
}
}
🔹 add():加法 🔹 subtract():减法 🔹 multiply():乘法 🔹 divide():除法 需指定舍入模式,否则可能抛出 ArithmeticException
BigDecimal大小比较
BigDecimal 不能直接用 > 或 < 比较,要用 compareTo() 方法:
BigDecimal num = new BigDecimal("-3");
if (num.compareTo(BigDecimal.ZERO) < 0) {
System.out.println("num 小于 0");
} else if (num.compareTo(BigDecimal.ZERO) > 0) {
System.out.println("num 大于 0");
} else {
System.out.println("num 等于 0");
}
compareTo() 返回值:
-1:小于
0:等于
1:大于
小数位控制 & 四舍五入规则
金额通常需要保留两位小数,BigDecimal 提供了 setScale() 方法来处理。
BigDecimal num = new BigDecimal("10.2621684798165165");
System.out.println("原始值: " + num);
System.out.println("直接截断: " + num.setScale(2, RoundingMode.DOWN));
System.out.println("向上取整: " + num.setScale(2, RoundingMode.UP));
System.out.println("四舍五入(5进): " + num.setScale(2, RoundingMode.HALF_UP));
System.out.println("四舍五入(5舍): " + num.setScale(2, RoundingMode.HALF_DOWN));
📌 常见的舍入模式:
RoundingMode.DOWN(直接截断)RoundingMode.UP(进位)RoundingMode.HALF_UP(四舍五入,5进)RoundingMode.HALF_DOWN(四舍五入,5舍)
Java中金额计算必须用 BigDecimal,避免浮点精度问题 🔹 数据库金额字段用 DECIMAL,并设置默认值0.00 🔹 运算时使用add()、subtract()、multiply()、divide()方法 🔹 比较大小用compareTo(),而非>< 🔹 setScale()处理小数位数,配合 RoundingMode 设定舍入规则
#Java开发#
