为何SQL Server中float类型ROUND(50.9685,3)舍入异常?如何解决?
SQL Server中ROUND(float)结果不符合预期的原因及解决方法
原因
float是近似数值类型,通过二进制编码存储数据,无法精确表示所有十进制小数。当执行CAST(50.9685 as float)时,实际存储的是一个略小于50.9685的近似值(类似50.96849999999999...),对这个近似值做ROUND(...,3)运算时,自然得到50.968而非预期的50.969。decimal(10,5)属于精确数值类型,可以精准存储十进制小数50.9685,因此ROUND运算的结果完全符合预期。
解决方法
- 核心方案:优先使用精确数值类型(
decimal/numeric)替代float处理需要精确小数的场景,从根源避免近似值带来的计算误差。 - 特殊场景处理:如果必须使用
float,可先将其转换为精确数值类型后再执行ROUND操作,示例语句:SELECT ROUND(CAST(CAST(50.9685 as float) as decimal(10,5)), 3) AS Col1 INTO #Test
内容的提问来源于stack exchange,提问作者Sergey Alikin
相关产品推荐
相关产品推荐

