在mysql中,decimal用来存储定点数,能够保证数值计算的精确性,常被用于订单金额、账户余额等场景。理解它的定义方式和实际用法,可以避免浮点类型带来的精度问题。

decimal类型的基本语法
decimal类型的完整写法为 DECIMAL(M,D),其中 M 表示总位数(精度),D 表示小数点后的位数(标度)。M 的取值范围为 1 到 65,D 的取值范围为 0 到 30,且 D 不能大于 M。
- M:数字总位数,包含整数部分和小数部分
- D:小数点后位数,决定保留几位小数
例如 DECIMAL(10,2) 表示最多存 10 位数字,其中小数占 2 位,整数最多 8 位。
创建表时使用decimal
下面通过一个商品订单表来演示decimal的定义方式:
CREATE TABLE order_info ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL, amount DECIMAL(10,2) NOT NULL COMMENT '订单金额', discount DECIMAL(5,4) DEFAULT 1.0000 COMMENT '折扣率' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入与查询数据
向表中插入decimal数据时使用普通数值即可,mysql会自动按标度处理:
INSERT INTO order_info (order_no, amount, discount)
VALUES ('NO20240101', 199.99, 0.8500);
SELECT order_no, amount, discount, amount * discount AS pay_amount
FROM order_info;
使用注意点
避免精度丢失
如果业务要求绝对精确,不要用 float 或 double,而应统一使用 decimal。float 在存储 0.1 这类小数时会产生微小误差。
标度溢出处理
当插入的小数位数超过 D 时,mysql会进行四舍五入。若整数部分超出 M-D 位,则会报错或截断,具体取决于sql_mode设置。
运算结果类型
两个decimal相乘,结果精度会按mysql规则扩展,一般建议在应用层明确四舍五入,或使用 ROUND() 函数控制输出格式。
SELECT ROUND(amount * discount, 2) AS final_price FROM order_info;
总结
mysql中decimal怎么用,核心就是根据业务确定 M 和 D,在建表时显式声明,并在计算后按需四舍五入。这样既能保证数据准确,也方便后期维护。