2011-07-21 29 views
6

我們的問題被歸納爲以下兩個語句:TSQL Round()不一致?

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 

的第一條語句使用浮動計算的410.115值,也與圓()到小數點後2位的是結果。整數值在410.11出來。

第二條語句使用浮點值410.115並將其舍入到小數點後兩位。四捨五入結果爲410.12。

爲什麼一個人四捨五入,另一個四捨五入時,它的價值被四捨五入相同?

我怎樣才能得到410.12的第一個陳述?

編輯:道歉格式 - stackoverflow不顯示任何格式在這臺機器上(很奇怪)。

回答

5

小數比浮點數的精度要好。如果您將float更改爲DECIMAL(18,2),您將獲得所期望的內容,並且不需要再調用循環函數。

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 

結果

unrounded roundedTo2dp 
410.12  410.12 

鏈接到MSDN約小數。 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。 Select round(convert(float,1.5555),2) - 給出1.56

選擇回合(convert(float,1.555),2) - 給出1.55!

有了這樣一個簡單的數字,在使用float時預期的結果是不同的。