浮動小数点数値データの浮動小数点型と実数型は、おおよその数値データ型です。
実数はfloat(24)と同じです。接尾辞なしでfloatを宣言すると、float(53)を意味します。
したがって、実際のもの(float(24))からfloat(53)に変換しています。単純に数字をより正確にしています。
float(24)の精度は7桁で、float(53)の精度は15桁です。
参照オンラインブック>フロートと実際(のTransact-SQL):https://msdn.microsoft.com/en-GB/library/ms173773.aspx
私たちはあなたの例を繰り返し、変換せずに変数を表示した場合、私たちは本当の変数は7桁の精度で表示されていることを確認し、フロートすることができます変数は正確に14桁の精度で表示されます。
DECLARE @realVariable as real,
@floatVariable as float;
-- Set to a number with 14 digits precision
SET @realVariable=152304.11999512;
SET @floatVariable=152304.11999512;
SELECT @realVariable AS '@realVariable', @floatVariable AS '@floatVariable';
あなたの質問に簡単な答えは二つの数が同じではないということです。フロート(53)付きのものはより正確です。
2つの数値の差のABSを計算し、これを許容可能なしきい値と比較することがその方法の1つです。しかし、規模が大きく異なる場合、これは満足できるものではありません。 0.0005の差をしきい値と比較し
r = 0.00
f = 0.00
は有用ではない:これは十分でないかもしれない理由を説明するために
。
したがって、数値のパーセンテージであるしきい値を使用する方がよい場合があります。
DECLARE @threshold AS float, @delta AS float;
SET @threshold = ABS(@floatVariable/1000000);
SET @delta = ABS(@floatVariable - CAST(@realVariable AS float));
SELECT @realVariable AS '@realVariable',
@floatVariable AS '@floatVariable',
@threshold AS '@threshold',
@delta AS '@delta',
CASE
WHEN @delta < @threshold THEN N'OK'
ELSE N'Different'
END AS 'Comparison';
注:このソリューションはゼロに非常に近い数字のための調整のビットを必要とする場合があります。
'SELECT CAST(CAST(CAST)(152304.11999512 AS REAL)AS FLOAT)AS DECIMAL(15,4))'? –
なぜ私はあまり正確でない結果を望んでいるのか分かりませんが。 –