当前位置: 代码网 > it编程>数据库>Mysql > MySQL对查询的值四舍五入保留两位小数的方法

MySQL对查询的值四舍五入保留两位小数的方法

2026年07月24日 Mysql 我要评论
前言开发财务、充值、消费、余额相关业务时,经常遇到金额展示需求:数据库原始小数位数较多,前端需要统一保留两位小数展示。很多同学习惯把原始数值查询出来,在 python / java 代码里做四舍五入处

前言

开发财务、充值、消费、余额相关业务时,经常遇到金额展示需求:数据库原始小数位数较多,前端需要统一保留两位小数展示。
很多同学习惯把原始数值查询出来,在 python / java 代码里做四舍五入处理。
实际上 mysql 原生提供数值函数,可以直接在sql层面完成四舍五入。

本文重点讲解 round() 函数,区分容易混淆的 truncate()format(),同时梳理财务场景踩坑点、null空值兼容方案,给出现成可直接复制的业务模板。

一、核心函数:round() 四舍五入

语法

round(数值, 保留小数位数)
  • 规则:四舍五入
  • 返回类型:数值类型,可以继续参与加减运算

基础示例

select round(123.456, 2);  -- 123.46
select round(123.454, 2);  -- 123.45
select round(100, 2);      -- 100.00

结合聚合函数 sum()(业务最常用)

统计充值、余额、消费金额场景:

-- 当日充值总额,求和后四舍五入保留2位
select round(sum(money), 2) as day_recharge
from sys_recharge_log
where create_time >= curdate() and create_time < curdate() + interval 1 day;

二、重要配套:兼容null空值 ifnull

一个高频坑:当查询没有匹配数据时,sum() 结果为 nullround(null,2) 依旧返回null。
程序如果直接使用会出现空值报错。
解决方案:ifnull() 兜底,不存在数据时返回 0.00。

标准生产写法:

select ifnull(round(sum(money), 2), 0.00) as day_recharge
from sys_recharge_log
where create_time >= curdate() and create_time < curdate() + interval 1 day;

逻辑说明:

  1. 先执行 sum 求和
  2. 求和结果传入round四舍五入
  3. 如果整体结果为null,替换为 0.00

三、容易混淆的两个函数,不要用错

1. truncate() 直接截断,不四舍五入

select truncate(123.459, 2); -- 123.45

适用场景:只想要舍弃后面小数、不进位;财务金额统计严禁使用,会造成金额误差。

2. format() 格式化(谨慎使用)

select format(ifnull(round(sum(money),2),0), 2);

特性:

  1. 自动增加千分位逗号 1,234.56
  2. 返回字符串类型
    ⚠️重大风险:
    拿到结果后如果继续做数值加减运算,极易引发类型异常;
    只适合直接前端展示,不适合后续参与计算。

总结区分:
✅ 金额统计、后续还要运算:round + ifnull
❌ 财务计算不要用 truncate
❌ 需要二次运算不要使用 format

四、实战多字段横向汇总场景

仪表盘统计多条金额指标,一次性统一处理小数:

select
    ifnull(round(sum(case when type=1 then money else 0 end),2),0.00) as money1,
    ifnull(round(sum(case when type=2 then money else 0 end),2),0.00) as money2,
    ifnull(round(sum(price),2),0.00) as consume
from sys_balance
where expire_time >= now() and status = 1 and user_id = 'xxx';

五、两种实现方案对比:sql处理 vs 应用代码处理

方案a:sql内部 round 处理(推荐)

优点:

  1. 统一规则,前后端不需要重复维护保留小数逻辑;
  2. 减少应用层判空、类型转换代码;
  3. 多条统计汇总时代码更简洁。

缺点:
复杂计算逻辑全部压在数据库,极端大量并发场景需要评估压力。

方案b:原始数值查出,python/java代码四舍五入

优点:灵活,可以针对不同场景切换保留位数;
缺点:

  1. 每个接口都要重复写格式化逻辑,容易漏写;
  2. 多人开发容易出现标准不统一,有的四舍五入、有的直接截断。

建议规范:单纯展示类报表、后台统计页面,优先sql层统一round。

六、高频开发踩坑清单

坑1:函数顺序写反

❌ 错误写法

round(ifnull(sum(money),0.00), 2)

逻辑没问题,但推荐下面可读性更强顺序;

✅ 推荐顺序

ifnull(round(sum(money), 2), 0.00)

坑2:忘记处理null,程序拿到none

没有业务数据时 sum 返回 null,前端展示出现空白。务必搭配 ifnull。

坑3:使用format接收后继续运算

# 危险!format返回带逗号的字符串,转float报错
row['day_recharge'] = "1,200.50"
float(row['day_recharge']) # 转换异常

坑4:金额字段使用float存储

浮点类型本身存在精度丢失,最佳实践:金额使用 decimal(18,2) 存储,从根源避免精度问题。

七、编码规范模板(直接复制使用)

单条金额统计标准模板

select ifnull(round(sum(money), 2), 0.00) as num
from sys_recharge_log
where create_time >= curdate() and create_time < curdate() + interval 1 day
and type = 1;

分组统计场景

select
    type,
    ifnull(round(sum(money), 2), 0.00) as total_money
from sys_balance
where status = 1
group by type;

八、全文总结

  1. 四舍五入优先使用 round(数值,2),返回数值,支持后续运算;
  2. 无匹配数据会产生null,固定搭配 ifnull(...,0.00) 兜底;
  3. truncate 截断不进位,财务业务禁止随意使用;
  4. format生成带千分位字符串,仅用于直接展示,不要参与数值计算;
  5. 报表类金额统计建议在sql层统一处理小数规则,避免应用代码各处重复格式化;
  6. 存储金额尽量使用 decimal 类型,规避浮点数精度丢失隐患。

财务数据对精度敏感,统一sql层使用round规范处理,能极大减少前后端因小数保留规则不一致产生的对账问题。

以上就是mysql对查询的值四舍五入保留两位小数的方法的详细内容,更多关于mysql查询值保留两位小数的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com