例で使用しているコードは次のとおりです。
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
結果は次のとおりです。
47
638
0
なぜ戻ってくるのか知りたいの0ですが0,073667712
回答:
除算で整数のみを使用すると、整数除算が得られます。(少なくとも1つ)doubleまたはfloatを使用すると、浮動小数点除算(および取得したい答え)が得られます。
だからあなたはできる
整数除算の結果を単にdoubleにキャストしないでください。除算はすでに整数除算として実行されているため、小数点以下の数値はすでに失われています。
除算の下部を1.0(または必要な小数点以下の桁数)だけ乗算します。
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2 *1.00000;
PRINT @weight
floatまたは任意の10進形式として宣言すると、次のように表示されます。
0
のみ
例:
declare @weight float;
SET @weight= 47 / 638; PRINT @weight
出力:0
次のような出力が必要な場合
0.073667712
例えば
declare @weight float;
SET @weight= 47.000000000 / 638.000000000; PRINT @weight
SQL Serverでは、結果が浮動小数点数である場合でも、2つの整数を直接除算すると整数が返されます。それを理解するための例を以下に示します。
--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float
--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7
select @weird_number_decimal
--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7
select @weird_number_numeric
--Right way
declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number
最後のブロックだけで3,14285714285714が返されます。正しい精度で定義された2番目のブロックにもかかわらず、結果は3.00000になります。