问题

今天执行一个存储过程的时候, 发现执行结果和预期的结果不一致, 但是存储过程并没有发生错误!于是就一句一句的去查找问题,最后发现是在对两个数字进行除法计算的时候产生的问题。我惊奇的发现 138 / 365 竟然等于 0。 我第一反应就是精度的问题(毕竟javaScript 也有类似的问题)。

来验证一下这个结论:
Sql 中两个数除法计算结果等于0原因是什么?
结果显而易见, 就是由于计算精度造成的。这是因为SQL Server会自动根据除数与被除数的最大精度去对运算结果取精度,这里的除数和被除数都是整数,所以得到的结果也是整数

如果不信, 我们再来试试
Sql 中两个数除法计算结果等于0原因是什么?

解决办法

可以通过在整数后面加上.0 来改变精度。也可以通过 Convert 函数来讲整数转换成其他的类型后进行计算。

-- 方法一
SELECT  138.0 / 365.0 Result1

--方法二
SELECT  ( CONVERT(FLOAT, 138) / CONVERT(FLOAT, 365) ) Result2
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐