SQL Server Round函数结果不一致问题咨询
SQL Server ROUND函数差异问题解析
核心原因:float类型的近似存储特性
SQL Server中float是IEEE 754标准的近似数值类型,无法精确表示所有十进制小数。你表中Price列的56.705并非存储为精确值,实际是一个接近但略小于56.705的近似值(例如56.70499999999999...);而你直接写的56.705是SQL Server识别的精确decimal字面量,两者本质是不同的数值,这导致了ROUND结果的差异。
验证近似值的存在
你可以通过以下查询查看Price列存储的实际近似值:
SELECT CAST(Price AS DECIMAL(20,15)) AS ExactFloatValue FROM SalesPrice WHERE Id = nnnnnn
执行后会看到该值并非精确的56.705,而是一个略小的数值。
ROUND函数的工作逻辑
ROUND函数遵循四舍五入到最近值的规则:
- 当处理精确的
56.705时,它处于56.70和56.71的中间位置,SQL Server会将其舍入到更大的56.71。 - 当处理
float列中存储的近似值(略小于56.705)时,该值更接近56.70,因此ROUND后得到56.7。
解决方案
- 修改列类型:将
Price列从float改为decimal(10,3)或numeric类型,这类是精确数值类型,能准确存储十进制小数,从根源避免近似存储带来的问题。 - 转换后再ROUND:如果无法修改列类型,在执行ROUND前先将
float值转换为精确的decimal类型:SELECT Price, ROUND(CAST(Price AS DECIMAL(10,3)), 2) AS RPrice, ROUND(56.705, 2) AS RDirect FROM SalesPrice WHERE Id = nnnnnn
内容的提问来源于stack exchange,提问作者David Martínez
相关产品推荐
相关产品推荐

