You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:57:43