2016-05-09 46 views
-1

ツールで移行中です。テーブルのデータ型の一部は、実数から浮動小数点数に変更されました。私はフロート結果はそのことを確認するにはどうすればよい リアル= 152304.1250 フロート= 152304.1200SQL Server RealおよびFloatのデータ型キャスト変換が一致しません

declare @realVariable as real, 
@floatVariable as float 

set @realVariable=152304.11999512 
set @floatVariable=152304.11999512 

select cast(@realVariable AS decimal(15, 4)) as realcol,str(@floatVariable,15,4) as floatcol 

結果が現実とフロート変数の両方のために異なっている:私が実行した次のコードを影響を理解するために、実際と同じですか?

+0

'SELECT CAST(CAST(CAST)(152304.11999512 AS REAL)AS FLOAT)AS DECIMAL(15,4))'? –

+0

なぜ私はあまり正確でない結果を望んでいるのか分かりませんが。 –

答えて

0

デルタが必要です。実数と浮動小数点の差の絶対値を計算し、それがデルタより小さいことを確認します。デルタは、あなたのニーズを満たすのに十分小さくなければなりません。

たとえば、次の値を使用します。 abs(152304.1250 - 152304.1200)< = .0050したがって、デルタ値として.0050を使用します。

+0

の場合、0.0050は多くの違いを生み出しますので、デルタを買う余裕はありません。 –

+0

あなたはあなた自身の質問に答えました。あなたの目的のために、実物をフロートと確実に比較することはできません。 – nicomp

+1

@ Somita、精度が重要な場合は、realまたはfloatではなく、正確な数値データ型を使用してください。どちらの数値も近似値です。 – HLGEM

1

浮動小数点数値データの浮動小数点型と実数型は、おおよその数値データ型です。

実数は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'; 

enter image description here

あなたの質問に簡単な答えは二つの数が同じではないということです。フロート(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'; 

enter image description here

注:このソリューションはゼロに非常に近い数字のための調整のビットを必要とする場合があります。

+0

「規模が大きく異なる場合、これは満足できるものではありません。 - それは確かです。スケールと精度は同じではありません。 – nicomp

1

@ RichardCLの説明は、物事の仕組み(+1)を表しています。今度は、realデータ型の値として格納された値をfloatデータ型の値として格納された値に変換すると、全体の正確な「元の」値が結果の値に格納されます。 real値のセット。

例を参照すると、152304.11999512の値は、realの値として正確に格納することはできません。これは四捨五入され、152304.125として格納されます。これをfloatに変換すると、まだ152304.125になります。

+0

質問から得た印象は、数値が再計算されることですが、そうではない可能性があります。 – RichardCL

+0

私はそれを「RealからFloatに変更しましたが、保存された数字はまだOKですか」と解釈しましたか?だから実際の問題はあまりにも曖昧です。 –

関連する問題