2017-11-14 28 views
0
select 3900.0 * 30097/30097 as result1 
select 3900.0/30097 * 30097 as result2 

は、結果は同じになることを決定するために(おそらく私だけか)ほとんどの人々を導く(3900)SQL Serverは同意しないようにしかし、それは思われる - waddupを?SQL分割乗算の実行順序

午後は、繁殖の順序を変えて分割すると問題が解決することが判明したばかりのバグを探しています。明らかに、SQLはクエリ2の最初の操作、すなわち3900.0/30097の結果を丸めますが、なぜですか?

答えて

1

てみ順序はすべての問題正確に何が必要

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

ではありませんので、オペレータの周りにブラケットを追加するには - あなたが明示的数値を変換する必要がある。すなわち、次のクエリ

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

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

です浮く。それはすべてです

1

その理由は、SQLサーバーが小数精度を失わないことです。算術演算子は左から右に作用し、最初の式では、実際の小数成分(117378300.0)は生成されませんが、2番目の演算子は小数点以下6桁(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 
あなたが実際に生成されたデータ型をテーブルに最初の結果を書き込み、観測の違いを見ることができます