SQL中TRUNCATE函数如何截断小数位?

梦雪君_2981

梦雪君_2981

2026-08-16

730人浏览

原创

truncate(x, d) 是 mysql 数值截断函数,不四舍五入,仅按位数直接丢弃多余数字:d>0 保留小数点后 d 位,d=0 去小数部分得整数,d<0 向高位归零;与 round(四舍五入)、format(字符串格式化且四舍五入)语义严格不同。

sql中truncate函数如何截断小数位?

TRUNCATE(x, d) 的基本行为:不四舍五入,只砍掉多余位

MySQL 的 TRUNCATE() 函数不是“四舍五入”,而是严格按位数截断:从左往右数到小数点后第 d 位,之后所有数字直接丢弃,不进位、不补零、不调整原值精度。比如 TRUNCATE(9.999, 1) 得到 9.9,不是 10.0,也不是 9.90。

常见错误是把它和 ROUND() 混用,结果发现数值“变小了却没预期 rounding 效果”——这是设计如此,不是 bug。

  • d 为正数(如 2):保留小数点后 d 位,如 TRUNCATE(123.4567, 2) → 123.45
  • d 为 0:直接去掉全部小数部分,返回整数,如 TRUNCATE(123.4567, 0) → 123
  • d 为负数(如 -1):向整数高位截断,TRUNCATE(123.45, -1) → 120(个位归零),TRUNCATE(123.45, -3) → 0
  • 若 x 或 d 为 NULL,结果恒为 NULL,不报错但需在业务逻辑中提前判断

和 ROUND()、FORMAT() 的关键区别在哪

三者都涉及小数位控制,但语义完全不同:

  • ROUND(x, d):先四舍五入再返回,ROUND(2.555, 2) → 2.56;它可能改变整数部分(如 ROUND(9.99, 0) → 10)
  • TRUNCATE(x, d):纯位数截断,TRUNCATE(2.555, 2) → 2.55;永远不会进位,也不会增加小数位数
  • FORMAT(x, d):返回的是字符串(不是数字!),带千分位逗号且强制四舍五入,FORMAT(1234.567, 1) → '1,234.6';不能用于后续数值计算

如果你要导出报表时“显示两位小数但不进位”,用 TRUNCATE();如果要“金额四舍五入到分”,必须用 ROUND();如果只是前端展示格式化,FORMAT() 可能更省事,但别拿它做 where 条件或 join 字段。

DECIMAL 字段里用 TRUNCATE() 还需要注意什么

当源字段是 DECIMAL(m,n)(比如 DECIMAL(10,4)),调用 TRUNCATE(col, 2) 后,结果仍是数字类型,但精度由函数决定,不再受原列定义约束。这意味着:

  • 不会自动补零:原值 10.0000 经 TRUNCATE(10.0000, 2) 得 10.00?错,实际得 10(因为 MySQL 内部标准化去除了尾随零)
  • 想保留固定小数位显示(如始终显示两位),得配合 CAST(... AS DECIMAL(10,2)) 或应用层处理,TRUNCATE() 本身不负责格式对齐
  • 在 GROUP BY 或 ORDER BY 中使用 TRUNCATE(col, d),要注意它会改变值的分布粒度,可能导致原本不同的值被归为同一组(例如 TRUNCATE(1.999, 0) 和 TRUNCATE(1.001, 0) 都是 1)

其他数据库里没有 TRUNCATE() 怎么办

MySQL 独有的 TRUNCATE(x,d) 在 PostgreSQL、SQL Server、Oracle 中并不存在(注意:SQL Server 的 TRUNCATE TABLE 是删表命令,和数值函数无关)。跨库兼容时常用替代方案:

  • PostgreSQL:用 TRUNC(x, d)(函数名同名但语法一致,可直接替换)
  • SQL Server:用 ROUND(x, d, 1),第三个参数 1 表示截断而非四舍五入
  • Oracle:用 TRUNC(x, d)(也是同名,行为一致)
  • 通用兜底(如 SQLite):CAST(x * POWER(10,d) AS INTEGER) / POWER(10,d),但要注意浮点精度误差,尤其对 DOUBLE 值不安全

最易踩的坑是误以为所有 SQL 方言都有 TRUNCATE() 数值函数,上线前务必确认目标数据库支持情况;生产环境混用时,建议封装成视图或中间层函数统一处理。

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

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

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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

3923

8

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

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

2023.10.27

831

4

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

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

2024.02.23

1029

5

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

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

2024.03.06

5761

10

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

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

2024.03.06

2703

4

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

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

2024.04.07

5740

11

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

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

2024.04.29

7601

6

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

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

2024.04.29

1030

5

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

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

2024.04.29

912

5

热门下载

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

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习