2013-02-25 63 views
0

我在嘗試以下使用SQL Server 2008 R2和SQL Server 2012,並且在兩者中都得到相同的結果。在SQL Server中四捨五入的錯誤

如果我寫如下語句:

select round(4.005, 2) 

我得到預期的結果:4.01

但是,如果我寫了下面的語句:

declare @result float 
select @result = 4.005 
select round(@result, 2) 

我得到了意想不到的結果: 4

但是如果我替換float真正在前面的語句:

declare @result real 
select @result = 4.005 
select round(@result, 2) 

我得到預期的結果。

誰能告訴我爲什麼會發生這種情況?

回答

0

這與float是一個近似的數據類型有關。

看到:http://technet.microsoft.com/en-us/library/ms187912(v=sql.105).aspx

浮子和真實的數據類型被稱爲近似數據類型。 float和real的行爲遵循關於近似數值數據類型的IEEE 754規範。 近似數字數據類型不存儲爲許多數字指定的確切值;他們存儲了一個非常接近的值。對於許多應用來說,指定值和存儲的近似值之間的微小差異並不明顯。有時候,差異變得明顯。由於float和真實數據類型的近似性質,當需要精確的數字行爲時(例如在財務應用程序中,涉及四捨五入的操作或平等檢查中),不使用這些數據類型。而是使用整數,小數,金錢或smallmoney數據類型。 避免在WHERE子句搜索條件中使用浮點或實數列,特別是=和<>運算符。最好將float和real列限制爲>或<比較。

IEEE 754規範提供了四種舍入模式:舍入到最近,舍入,舍入和舍入爲零。 Microsoft SQL Server使用四捨五入。所有的都精確到保證的精度,但可能會導致浮點值略有不同。 由於浮點數的二進制表示可能使用許多合法舍入方案之一,因此不可能可靠地量化浮點值。

+0

現在有效,謝謝你的迴應 – vcRobe 2013-02-25 19:27:21

1

因爲你沒有指定用於存儲科學記數法float數的尾數位的數量,試試這個,

declare @result float(5) 
select @result = 4.005 
select round(@result, 2) 
+0

因爲float(5)= real(這就是Books Online所說的),如果你沒有指定值,那麼它需要53作爲默認值,所以如果你嘗試任何大於24的值,它會失敗。爲什麼? – vcRobe 2013-02-25 17:37:17