SQL Divide Multiply执行顺序

时间:2017-11-14 16:54:22

标签: sql sql-server

select 3900.0 * 30097 / 30097 as result1
select 3900.0 / 30097 * 30097 as result2

查看这两个查询会导致大多数人(或者可能只是我)确定结果是相同的(3900)但是看起来SQL Server不同意 - waddup?

花了一个下午寻找一个错误只是为了找到我的问题可以解决,如果我改变乘法和除法的顺序 - 我们总是告诉订单并不重要?显然,SQL会将查询2中第一个操作的结果四舍五入,即3900.0 / 30097,但为什么呢?

3 个答案:

答案 0 :(得分:1)

尝试在运算符周围添加括号,因此订单不会出现任何问题

select (3900.0 * 30097) / 30097 as result1
select 3900.0 / (30097 * 30097)as result2

答案 1 :(得分:1)

原因是SQL服务器不会丢失小数精度。算术运算符从左到右工作,在第一个等式中,初始操作不会创建实际的小数部分(117378300.0),而第二个生成一个带有六位十进制数字的数字(0.1295810)。因此,在后续操作中,SQL Server将分别保留0和6个小数位,以免“丢失数据”。实际上,您可以看到将初始结果写入表并观察生成的数据类型的区别:

select 3900.0 * 30097 val
into tbl_a

select 3900.0 / 30097  val
into tbl_b

select table_name, column_name, numeric_precision, numeric_scale
from information_schema.columns 
where  table_name in ( 'tbl_a', 'tbl_b')

产生

table_name  column_name numeric_precision   numeric_scale
tbl_a   val 11  1
tbl_b   val 11  7 <-- decimal component

答案 2 :(得分:0)

正是您需要的 - 是下一个查询

select result1 = convert(float,3900.0) * 30097 / 30097  

select convert(float,3900.0)/ 30097 * 30097enter as result2

即。您必须将一个数字显式转换为float。这就是全部

相关问题