2016-10-12 4 views
0

ラウンド関数には2つの動作があります。値coursが "3.1235"、round(cours, 3) = 3.123に等しい。しかし、このラウンド公式では、コースをその値(3.1235)で置き換えると、round(3.1235, 3) = 3.1240となります。SQLサーバーのラウンド関数のさまざまな動作

+0

どのようなタイプは、 'cours'のですか? – Mureinik

+0

コースの種類はフロートです。 –

+0

問題を再現できますか?これらが等しいので、私たちに言っていないことがあります... 'decare(5,4)= 3.1235 選択ラウンド(@cours、3) 選択ラウンド(3.1235,3)' – scsimon

答えて

0

このような小数点以下の値にはfloatデータ型を使用しないでください。そのような目的のために設計されていないためです。あなたがしようとしているもののより良いコンテキストを得るためにコードをもっと見る必要がありますが、もしが最初に浮動小数点であることがであれば、10進数で@coursをキャストできますか?

round(cast(@cours as decimal(5,4)), 3)

0

あなたのFLOATは、本当にそれが印刷されたグリッドに示されているものだけで、3.1235が含まれていません。内部的にFLOATは3.1234999999999999であり、これは明らかに、3.123に切り捨てられている。

リテラル3.1235は、完全に正確であるほどの精度を持つ数値になります。したがって、予想通り、3.124に切り上げられます。

証明:

SELECT CAST('3.1235' as FLOAT), 
     CAST(3.1235 as FLOAT) 
-- misleading output: both print 3.1235 

SELECT CAST(CAST('3.1235' as FLOAT) as NUMERIC(24,23)), 
     CAST(CAST(3.1235 as FLOAT) as NUMERIC(24,23)) 
-- both print 3.12349999999999990000000 

SELECT CAST('3.1235' as NUMERIC(24,23)), 
     CAST(3.1235 as NUMERIC(24,23)) 
-- both print 3.12350000000000000000000 
関連する問題