select 3900.0 * 30097 / 30097 as result1
select 3900.0 / 30097 * 30097 as result2
查看这两个查询会导致大多数人(或者可能只是我)确定结果是相同的(3900)但是看起来SQL Server不同意 - waddup?
花了一个下午寻找一个错误只是为了找到我的问题可以解决,如果我改变乘法和除法的顺序 - 我们总是告诉订单并不重要?显然,SQL会将查询2中第一个操作的结果四舍五入,即3900.0 / 30097,但为什么呢?
答案 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。这就是全部