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

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。

解决方案

  1. 使用精确数值类型:改用decimal或numeric类型存储需要精确计算的小数,这类类型基于十进制存储,能精确表示1.24这类数值:
declare @d2 decimal(10,2) = 1.24;
select round(@d2, 2, 1) -- 返回1.24
  1. 转换后再截断:若必须使用float类型,可先将其转换为decimal类型后再执行截断操作:
declare @f2 float = 1.24;
select round(cast(@f2 as decimal(10,2)), 2, 1) -- 返回1.24

内容的提问来源于stack exchange,提问作者werot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:15:31