SQL Server中SUM(FLOAT)在SELECT与HAVING中与1判断不一致的原因
FLOAT类型SUM后出现的精度差异问题解析
- FLOAT是近似数值类型:FLOAT存储的是二进制浮点近似值,并非精确的十进制数。你看到SUM结果显示为1,但底层实际存储的可能是一个极其接近1但存在微小偏差的数值(比如0.9999999999999998或1.0000000000000002)。
- 查询结果的精度截断:SQL Server在展示FLOAT类型的查询结果时,会默认截断到一定的十进制精度,把近似值显示为最接近的整数1,但这个截断仅作用于显示层面,不会改变实际存储的数值。
- HAVING子句的精准比较:
SUM(R.Valor) <> 1是直接用底层的近似值和精确的十进制1做比较,因为实际值并非严格等于1,所以这条记录会被筛选出来。 - 不同数据库的默认行为差异:其他数据库可能对FLOAT类型的比较逻辑或显示精度有不同的默认处理,比如自动做了隐式的精度截断或近似匹配,因此不需要手动ROUND也能得到预期结果。
- ROUND的作用:
ROUND(SUM(R.Valor), 0)将SUM后的近似值四舍五入到整数位,消除了微小的精度误差,此时再和1比较就能正确匹配,达到预期的筛选效果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

