TSQL中ROUND函数结合截断参数处理简单float值是否正常?
关于SQL Server中ROUND函数截断float类型的异常行为分析
在SQL Server 2019 (RTM-CU18)环境中,执行以下代码时出现不符合预期的结果:
declare @f2 float = 1.24; select round(@f2, 2, 1)
实际输出结果为:
1.23
原因分析
尽管1.24看起来是简单的十进制小数,但float类型采用二进制浮点存储,无法精确表示所有十进制小数。1.24在二进制中是无限循环的近似值,实际存储的数值略小于1.24(例如类似1.2399999999999998的数值)。当ROUND函数第三个参数设为1时,执行的是截断操作(而非四舍五入),直接截取到指定的2位小数位,因此这个略小的近似值被截断后得到1.23。
解决方案
- 使用精确数值类型:改用
decimal或numeric类型存储需要精确计算的小数,这类类型基于十进制存储,能精确表示1.24这类数值:
declare @d2 decimal(10,2) = 1.24; select round(@d2, 2, 1) -- 返回1.24
- 转换后再截断:若必须使用float类型,可先将其转换为decimal类型后再执行截断操作:
declare @f2 float = 1.24; select round(cast(@f2 as decimal(10,2)), 2, 1) -- 返回1.24
内容的提问来源于stack exchange,提问作者werot
相关产品推荐
相关产品推荐

