MySQL中如何进行四舍五入并保留小数_使用ROUND函数处理

云雪小哥_6481

云雪小哥_6481

2026-05-19

402人浏览

原创

MySQL的ROUND()默认采用“四舍六入五成双”(银行家舍入),非传统四舍五入;如需后者,应使用ROUND(x + SIGN(x) * 0.5 - 0.5)并配合DECIMAL类型规避浮点误差。

mysql中如何进行四舍五入并保留小数_使用round函数处理

MySQL的ROUND()默认不是“四舍五入”,而是“四舍六入五成双”(银行家舍入),直接写ROUND(x, 2)可能在临界值上出错,比如ROUND(2.5, 0)得2而非3。真要传统四舍五入,得绕一下。

ROUND(x, d) 的小数位控制必须显式传参

省略第二个参数等价于ROUND(x, 0),仍走银行家规则;想保留两位小数,必须写ROUND(x, 2)。负数精度也有效:ROUND(1234.56, -2) → 1200,但对FLOAT列效果不稳定。

常见错误现象:

  • SELECT ROUND(1.235, 2)有时返回1.23而不是1.24——根本原因是1.235在二进制中无法精确表示,实际存储值略小于1.235
  • ROUND(price)和ROUND(price, 0)行为一致,但容易让人误以为“不写参数就更‘原始’”,其实没区别

严格传统四舍五入的写法(含正负数)

别用FLOOR(x + 0.5),它在负数上失效(如FLOOR(-1.6 + 0.5) = FLOOR(-1.1) = -2,但期望是-2没错?等等——-1.6传统四舍五入应为-2,而-1.4应为-1,所以FLOOR(x + 0.5)对负数其实偶然成立,但不通用。

稳妥写法是:ROUND(x + SIGN(x) * 0.5 - 0.5)

使用场景:

Mysql Skill 1.0.0 (3)
Mysql Skill 1.0.0 (3)

MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。

下载
  • 财务报表导出要求“小学数学规则”,不能接受银行家舍入
  • 该表达式在x = 0时安全(SIGN(0)返回0,整体为ROUND(-0.5) → 0)
  • 配合CAST(... AS DECIMAL(10,2))可进一步规避浮点误差

DECIMAL字段里ROUND没反应?先查插入时是否已被截断

建表定义price DECIMAL(10,2),插入9.995后查出来就是9.99——这不是ROUND()的问题,是DECIMAL类型在INSERT时就按定义精度**直接截断**(非舍入),且不可逆。

实操建议:

  • 插入前用ROUND(原始值, 2)处理,再存入DECIMAL(10,2)
  • 若需中间计算留余量,字段定义放宽:比如预期存2位小数,设为DECIMAL(10,4),最后查询时再ROUND(col, 2)
  • 用SHOW COLUMNS FROM table_name确认字段真实定义,别只信业务文档

GROUP BY 或 ORDER BY 中用 ROUND 容易分组错乱

对DOUBLE类型字段直接ROUND(price, 1) GROUP BY,可能导致本该归为同一组的1.15和1.1499999999999999被拆开——因为后者实际二进制表示略小,ROUND()后变成1.1而非1.2。

解决方案:

  • 优先转类型:ROUND(CAST(price AS DECIMAL(10,3)), 1)
  • 或放大取整再缩回:ROUND(price * 10) / 10(比ROUND(price, 1)抗浮点误差)
  • 调试时加一列看原始精度:SELECT price, BIN(price), ROUND(price, 1) FROM t LIMIT 5

最易被忽略的一点:ROUND的行为高度依赖输入值的底层类型。同一条SQL,在DECIMAL列上稳定,在FLOAT列上可能每次执行结果都不同——别把精度问题甩锅给函数本身,先盯住数据怎么来的、存在哪、怎么算的。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4923

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

1011

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1289

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6961

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3623

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6940

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9681

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1310

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1152

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 196人学习