ROUND函数n为负数时向左舍入到整数位(如-2=百位),非报错;CEIL/CEILING跨库兼容性差;ROUND+CEIL链式调用易因隐式转DOUBLE致精度丢失;货币结算需警惕银行家舍入陷阱。ROUND 函数四舍五入时,小数位数参数为负数是什么意思ROUND(value, n) 的第二个参数 n 为负数时,不是报错,而是向左对整数部分做舍入------比如 ROUND(1234.56, -2) 结果是 1200,相当于"舍到百位"。这在按千/万单位聚合、报表取整展示时很实用,但容易被当成 bug 忽略。常见错误现象:ROUND(999.99, -1) 返回 1000,而不是 990;因为它是先按十位舍入(即看个位),再进位。实际逻辑是:把数字除以 10^ABS(n) → 四舍五入 → 再乘回去。MySQL 和 PostgreSQL 行为一致;SQL Server 也支持负数,但旧版本(2005 以前)不支持如果想"截断"而非"四舍五入",不能用 ROUND,得用 FLOOR 或字符串截取注意浮点精度问题:ROUND(1.235, 2) 在某些数据库里可能返回 1.23 而非 1.24,这是底层二进制表示导致的,不是函数缺陷CEIL 和 FLOOR 在不同数据库中的函数名差异CEIL 是标准 SQL 函数名,但 MySQL 早期版本只认 CEILING,PostgreSQL 全都支持,SQL Server 只支持 CEILING。写跨库 SQL 时硬写 CEIL 可能直接报错 Invalid function name 'CEIL'。使用场景:计算分页总页数(CEILING(total_count / page_size))、向上取整分配资源(如最小服务器数量)、避免因浮点除法结果略小于整数而误判为"不够"。PostgreSQL 中 CEIL 和 CEILING 完全等价;MySQL 8.0+ 已支持 CEIL,但 5.7 及更早必须用 CEILINGSQLite 没有原生 CEIL,得用 -FLOOR(-x) 替代Oracle 的 CEIL 接受 NUMBER 类型,但如果传入 BINARY_FLOAT 可能触发隐式转换警告ROUND + CEIL 混用时的隐式类型转换陷阱当 ROUND 输出作为 CEIL 输入时(例如 CEIL(ROUND(price * 1.08, 2))),看似合理,但某些数据库(如老版本 Hive)会在中间步骤把 DECIMAL 转成 DOUBLE,引发精度丢失------ROUND(199.99 * 1.08, 2) 理论应为 215.99,却可能算出 215.98999999999998,再套 CEIL 就变成 216。 Trenz AI驱动的社交电商营销平台,专为TikTok Shop设计
相关推荐
guodingdingh几秒前
软件开发工作问题总结0718GuWenyue2 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%想会飞的蒲公英3 小时前
计算机怎样读取中文文本:编码、清洗与标准化Miao121314 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架CodexDave4 小时前
MySQL事务隔离级别与MVCC机制解析深度研习笔记4 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现曾阿伦4 小时前
MongoDB 查询语句备忘手册一叶龙洲4 小时前
wslg打开Ubuntu24.04默认打开图形界面