2011-07-21 24 views
6

我々が持っている問題は、次の2つのステートメントに縮小されていますTSQLラウンド()不一致?

select convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) as unrounded, round(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)), 2) as roundedTo2dp 

select convert(float, 410.115) as unrounded, ROUND(convert(float, 410.115), 2) as roundedTo2dp 

最初の文は、小数点以下2桁までのラウンド()で410.115の値を計算するためにフロートを使用し、また、その結果。丸められた値は410.11で出ます。

2番目のステートメントはfloat値410.115を使用し、小数点以下2桁まで四捨五入します。丸められた結果は410.12として出てくる。

なぜ値が丸められた場合、1つは切り捨てられ、もう1つは切り上げられますか?

は、どのように私は410.12に丸めるための最初の文を得ることができますか?

EDIT:書式設定のお詫び - このマシンにはフォーマットが表示されません(ごく奇妙です)。

答えて

5

小数はフロートより精度で優れています。浮動小数点数をDECIMAL(18,2)のように変更した場合、期待しているものが得られ、ラウンド関数をもう呼び出す必要はありません。小数についてのMSDNへ

unrounded roundedTo2dp 
410.12  410.12 

リンクで

select convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)) as unrounded, round(convert(decimal(18,2), (convert(decimal(18,2),5741.61)/convert(decimal(18,2), 196.00)) * convert(decimal(18,2),14.00)), 2) as roundedTo2dp 

結果。 http://msdn.microsoft.com/en-us/library/ms187746.aspx

希望が...

4

数は等しくない:

SELECT CAST(convert(float, (convert(float,5741.61)/convert(float, 196.00)) * convert(float,14.00)) AS BINARY(8)) 
UNION ALL 
SELECT CAST(convert(float, 410.115) AS BINARY(8)) as bin 

---- 
0x4079A1D70A3D70A3 
0x4079A1D70A3D70A4 
2

「フロート」は概数データ型であるため、データ型の範囲内のすべての値を正確に表現することができません。

これはhttp://msdn.microsoft.com/en-us/library/ms173773.aspxに基づいています。

フロート値を使用している間に丸めの問題があると私は考えています。 100%確実になることは決してありません!

Ex。 選択ラウンド(変換(浮動小数点、1.5555)、2) - 与えられた1.56

選択ラウンド(変換(float、1.555)、2) - 1.55を与えます!

このような単純な数値では、floatを使用しているときに期待される結果に違いがあります。