电脑生活派
柔彩主题三 · 更轻盈的阅读体验

整数保留两位小数?数据库里这样写才不翻车

发布时间:2026-01-22 22:40:52 阅读:81 次

做报表、导数据、算金额,经常遇到一个看似简单却容易踩坑的问题:明明存的是整数(比如 100),但前端或财务要求显示成 100.00——也就是「整数保留两位小数」。别急着在程序里转字符串,先看看数据本身能不能搞定。

为什么不能直接加 .00?

有人图省事,在 SQL 里写 SELECT price + '.00' 或拼接字符串,结果发现:数字变文本了,排序错乱、求和报错、导出 Excel 后自动去零……这不是修bug,是埋雷。

MySQL 怎么办?用 FORMAT 或 ROUND 都得小心

FORMAT(100, 2) 看似完美,返回 '100.00',但它本质是字符串,而且带千分位逗号(比如 1,000.00),财务系统常拒收。更稳妥的是:

SELECT ROUND(100, 2) AS price_rounded;

但注意:ROUND 对整数本身不会补零,100 还是返回 100.00(数值型),显示时是否带两位小数,取决于客户端或应用层格式化设置。

真要输出带两位小数的数值型结果,推荐用 CAST + DECIMAL

SELECT CAST(100 AS DECIMAL(10,2)) AS price_fixed;

这条语句强制把整数转为「最多10位、小数点后固定2位」的十进制数,结果就是数值型的 100.00,支持计算、排序、导出,毫无副作用。

PostgreSQL 更直白:直接用 ::numeric

PostgreSQL 里写法更简洁:

SELECT 100::numeric(10,2) AS price_fixed;

效果一样:输出数值型 100.00,参与运算不掉精度,导出到 Excel 也能自动识别为货币格式。

SQL Server 别忘 CONVERT 的精度参数

在 SQL Server 中,光用 CONVERT(decimal, 100) 不行,它默认小数位是 0。必须显式指定:

SELECT CONVERT(decimal(10,2), 100) AS price_fixed;

否则导出时还是显示成 100,前端还得二次处理。

实际场景举个栗子

某电商后台要查商品售价,原始表里 price 是整数(单位:分),比如 999 表示 9.99 元。想直接查出「元为单位、保留两位小数」的结果:

-- MySQL 写法
SELECT CAST(price / 100.0 AS DECIMAL(10,2)) AS price_yuan FROM products;

-- PostgreSQL 写法
SELECT (price / 100.0)::numeric(10,2) AS price_yuan FROM products;

这样查出来的 price_yuan 就是标准的 9.99(数值型),不用再担心前端 JS 的 toFixed() 在某些浏览器里四舍五入异常,也不用怕导出 CSV 后 Excel 自动抹掉末尾零。