问题
今天执行一个存储过程的时候, 发现执行结果和预期的结果不一致, 但是存储过程并没有发生错误!于是就一句一句的去查找问题,最后发现是在对两个数字进行除法计算的时候产生的问题。我惊奇的发现 138 / 365
竟然等于 0。 我第一反应就是精度的问题(毕竟javaScript 也有类似的问题)。
来验证一下这个结论:
结果显而易见, 就是由于计算精度造成的。这是因为SQL Server会自动根据除数与被除数的最大精度去对运算结果取精度,这里的除数和被除数都是整数,所以得到的结果也是整数。
如果不信, 我们再来试试
解决办法
可以通过在整数后面加上.0
来改变精度。也可以通过 Convert
函数来讲整数转换成其他的类型后进行计算。
-- 方法一
SELECT 138.0 / 365.0 Result1
--方法二
SELECT ( CONVERT(FLOAT, 138) / CONVERT(FLOAT, 365) ) Result2