T-SQL中POWER函数计算结果精度异常,为何需要将参数转换为float类型?
POWER函数返回精度异常原因解析
- 字面量默认类型判定问题
你直接书写的.9在绝大多数SQL实现中,会被默认识别为DECIMAL(定点数)类型,而非浮点数。按照通用的类型推导规则,.9会被判定为DECIMAL(1,1)类型:总长度1位,全部为小数位,仅能存储小数点后1位的数值。 - 直接乘法返回正确结果的逻辑
两个DECIMAL类型做乘法运算时,数据库会自动扩展结果的精度:两个DECIMAL(M1,D1)和DECIMAL(M2,D2)相乘,返回结果默认是DECIMAL(M1+M2, D1+D2)类型。对应到.9*.9的运算,结果类型就是DECIMAL(2,2),刚好可以完整存储0.81,不会出现截断或者四舍五入。 - 直接调用
POWER(.9,2)返回0.8的原因POWER()是重载函数,会根据入参的类型匹配对应的实现逻辑:当入参为DECIMAL类型时,大多数数据库的POWER()实现会默认限制返回值的小数位数和底数的小数位数一致,也就是返回DECIMAL(1,1)类型,0.81会被截断/四舍五入为0.8,因此出现结果不符合预期的问题。 - 类型转换后返回正确结果的逻辑
CAST(.9 AS FLOAT)会把定点数转为浮点数类型,此时POWER()会匹配浮点数的幂运算实现,返回浮点数类型的结果,没有固定小数位数的限制,因此可以正常返回0.81的计算结果。
内容的提问来源于stack exchange,提问作者umbersar
相关产品推荐
相关产品推荐

