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