SQL实现保留1位小数且第二位小数≥5时向上取整的问题
解决SQL中保留1位小数且第二位≥5时向上取整的问题
问题描述
需要将数值取整到1位小数,规则是第二位小数为5或以上时必须向上取整,示例如下:
- 16.55 → 16.6
- 5.42 → 5.4
- 23.88 → 23.9
尝试使用SELECT ROUND(time, 1, 1) as time时,多数情况有效,但当第二位小数为5时会被截断(比如16.55变成16.5),不符合需求。
原因分析
ROUND(time, 1, 1)中的第三个参数(部分数据库支持,如MySQL)代表截断模式,它会直接丢弃目标小数位之后的所有数字,而不是进行四舍五入计算,所以才会出现16.55被截断为16.5的情况。
解决方案
根据不同数据库特性,有两种可靠的处理方式:
1. 直接使用标准四舍五入(适用于MySQL等普通四舍五入的数据库)
如果你的数据库(如MySQL)的ROUND函数采用普通四舍五入规则,直接去掉第三个参数即可:
SELECT ROUND(time, 1) AS time;
这个语句会自动将第二位小数≥5的数值向上取整,比如ROUND(16.55,1)返回16.6,完全符合需求。
2. 手动实现强制向上取整(适用于银行家舍入的数据库,如SQL Server)
部分数据库(如SQL Server)的ROUND默认是银行家舍入(四舍六入五成双,即当第二位是5时,前一位为偶数则舍去,奇数则进一位),这可能不符合你的严格需求。此时可以用以下语句强制实现“第二位≥5则向上取整”:
SELECT FLOOR(time * 10 + 0.5) / 10 AS time;
原理是:
- 将数值放大10倍,把第一位小数转化为整数部分
- 加上0.5后,用
FLOOR取整:如果原第二位小数≥5,加0.5后会进位;如果<5,加0.5后不会进位 - 最后除以10还原为1位小数
测试示例:
- 16.55 *10 +0.5 = 166 → FLOOR后是166 → 166/10=16.6
- 5.42 *10 +0.5=54.7 → FLOOR后是54 →54/10=5.4
- 23.88*10+0.5=239.3 →FLOOR后是239 →239/10=23.9
完全符合你的要求。
内容的提问来源于stack exchange,提问作者pileup
相关产品推荐
相关产品推荐

