订单金额36.785元,展示要保留两位,评分、百分比、单价,到处是这类需求,mysql round一步到位。写法:SELECT ROUND(36.785, 2),结果36.79。第一个参数是被处理的数,第二个参数是保留几位小数,不写默认按0处理。
第二参数还支持负数,这是很多人不知道的。ROUND(1234, -2)结果是1200,从十位开始舍,适合把数据归整到百位、千位做汇报。负数位舍整数部分,正数位舍小数部分,方向别搞反。ROUND(36.785)不带第二参数,直接得37。
和截断、取整函数的区别
- ROUND:四舍五入,36.785保留两位得36.79
- TRUNCATE(36.785, 2):直接截断,得36.78,不做四舍五入
- CEIL向上取整,FLOOR向下取整,返回的都是整数
- FORMAT四舍五入还顺手加千分位,但返回字符串,只适合展示
- 字段是字符串时先CAST转数值再舍,混着用容易报错或得0
五入五不入的细节
.5的情况有讲究。对DECIMAL这类精确类型,MySQL按常规四舍五入,ROUND(2.5)得3;对FLOAT和DOUBLE这类近似类型,结果受底层实现影响,2.5可能舍成2。所以涉及金额的字段建表就用DECIMAL,别用float,round出来的数字才有保证。精度问题不止MySQL,所有按IEEE754存浮点的系统都一样,数据库这边用DECIMAL规避最省心。
实际用的时候注意顺序:先算后舍还是先舍后算,分摊优惠这类业务里两种写法的账目能对不上。报表需求里把mysql round放最外层,别在中间步骤反复舍入,误差会滚雪球。上线前在测试表把两种顺序都跑一遍,对完账再发。
验证方法最快:SELECT ROUND(2.5), ROUND(2.5, 1), ROUND(1234, -2);三条一起跑,看结果比看文档直观。