2016-04-11 5 views
2

SQL Server 2008 R2を使用しています。この比較が真実に戻るのはなぜですか?値は非常に異なっている、1.98および2.2のとおりです。SQL Serverの2つの小数の比較が正確でない

declare @num1 decimal = 1.98; 
declare @num2 decimal = 2.2; 

if(@num1 != @num2) 
    select 0; 
else if(@num1 = @num2) 
    select 1; 
+2

'select @ num1、@ num2' *を直ちに実行しないでください。この問題が何であるかを示し、基本的なコーディングの最初のステップになりますか? – TZHX

+0

@TZHXありがとう、私はそれについても考えなかった。今問題がどこにあるのか分かります。 – FrenkyB

答えて

5

ますデフォルトの精度と位取りを指定していません。デフォルトの精度は18でスケールは0です。つまり、小数点の後に桁がないことを意味します。 documentationを参照してください。次いで

declare @num1 decimal(18, 0) = 1.98; 
declare @num2 decimal(18, 0) = 2.2; 

SQL Serverの適切な値に定数を変換した値を割り当て、両方が「2」に設定されている:

したがって、これは同等です。

これらの値を正確に保存するには、精度/スケールを明示的に設定する必要があります。

値が丸められているのは、両方とも小数であるためです。これは一般的なルールではありません。 hereのように、タイプによって異なります。

小数点以下の異なるデータ型を変換すると、結果値が切り捨てられ、他のときに丸められます。正確なルールは以下の表に記載されています。

7

あなたは@num1@num2変数のあなたの宣言で精度規模値が含まれていません。したがって、デフォルト値が使用されています。 documentationによれば

スケール精度が指定されている場合にのみ指定することができます。デフォルトの は0です。したがって、0 < = s < = p。最大ストレージサイズは、精度で に基づいて異なります。だから、

あなたは簡単のように宣言文を使用して問題を回避することができます0に両方の変数のデフォルトのスケールので、両方の変数が2

に設定されています:

declare @num1 decimal(10,2) = 1.98; 
declare @num2 decimal(10,2) = 2.2; 
関連する問題