首页/数据/SQL 速查/TRUNCATE 截断小数(注意与清表语句同名)
函数速查60 条

TRUNCATE 截断小数(注意与清表语句同名)

按位数直接截断、不做舍入:MySQL TRUNCATE(x,d)、PostgreSQL trunc(x,d);名字与 TRUNCATE TABLE 相同但不是一回事。

SQL 速查数据更新于 2026-10-13

函数与同名的清表语句

TRUNCATE(x, d) 按位数直接截断小数、不做四舍五入:MySQL 用 TRUNCATE,PostgreSQL 用 trunc。它的名字和清表语句 TRUNCATE TABLE 完全相同,但一个是数值函数、一个是 DDL,毫无关系。搜索引擎里混着大量清表内容,抄写时格外容易错。

基本信息

MySQL 函数TRUNCATE(x, d)
PostgreSQL 函数trunc(x, d)
与 ROUND 区别只截断不舍入:2.999 保留两位得 2.99
负位数向整数位方向截断(-2 截到百位)
同名陷阱与清表语句 TRUNCATE TABLE 同名,语义完全不同

典型使用场景

  • 金额向下取整:宁少算不多算
  • 统计口径按条截断,避免四舍五入把结果放大
  • 按百位、千位截断做粗粒度分组
  • 与 ROUND 对比,验证业务的舍入规则
  • 生成固定精度的展示值

示例

示例
-- MySQL 写法
SELECT TRUNCATE(2.999, 2);        -- 2.99,注意不是 3.00
SELECT TRUNCATE(1234.5678, -2);   -- 1200,向百位截断
SELECT ROUND(2.999, 2);           -- 3.00,用来对比舍入差异

-- PostgreSQL 写法
SELECT trunc(2.999, 2);           -- 2.99
SELECT trunc(1234.5678, -2);      -- 1200
SELECT trunc(2.999);              -- 2,省略位数时截到整数

截断与舍入对照

函数2.999 保留两位1234.5678 取 -2
MySQL TRUNCATE2.991200
PostgreSQL trunc2.991200
MySQL ROUND3.001200
PostgreSQL round3.001200
截断方向是「向零」:TRUNCATE(-2.999, 2) 得到 -2.99 而不是 -3.00。业务需要向下取整(向负无穷方向)时要用 FLOOR,两者对负数的结果不同。
区分两种 TRUNCATE:数值函数带两个参数,写成 TRUNCATE(x, d);清表语句是 TRUNCATE TABLE 加表名。执行前确认关键字后面有没有 TABLE,这一步能避免最严重的一类误操作。
截断与舍入的选择要跟业务口径对齐:金额向下取整、税费向上取整都可能出现,用同一个函数套所有字段容易在对账时留下零星差异,规则定下来后写进注释或文档。
把整数位截断用于粗粒度统计很常见:按百位或千位截断能快速看量级分布,但明细精度会丢失,不能拿截断后的值去做需要精确合计的报表。
生成固定精度文本时先截断再格式化:直接格式化会先四舍五入,展示值可能比实际可结算值大,把顺序调换一下就能避免这类对账争议。

易错点

  • 本意是截断小数却写成 TRUNCATE TABLE 表名:生产上直接清空表,属于高危操作,执行前务必确认语句形态
  • 以为 TRUNCATE 会四舍五入:它只截断,2.999 保留两位是 2.99,金额对账时差异会累积
  • 对负数期待向下取整:截断方向是向零,-2.999 得 -2.99,要向负无穷取整要用 FLOOR
  • 负位数含义记错:-2 表示截到百位,而不是保留两位小数
  • 在 PostgreSQL 里写成 TRUNCATE(x, 2):PG 的数值函数是 trunc,会报函数不存在

数据来源与参考

  • MySQL 8.0 Reference Manual · TRUNCATE
  • PostgreSQL Documentation · Mathematical Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌