2011-10-10 118 views
0

我正在使用SQL Server 2005.並且我正在使用ROUND T-SQL函數舍入十進制列值。但看起來四捨五入的值是不正確的。SQL Server舍入問題

PRINT ROUND(1890.124854, 2) => 1890.120000 

如圖ROUND函數將返回1890.12其中因爲它應該是1890.13。有沒有人遇到過這種情況,應該採用正確的四捨五入方式,以便獲得期望值1890.13 ..?

謝謝。

+4

爲什麼應該是1890.13?你要求它舍入到小數點後兩位,而且它的確如此 - .xx4向下舍入,而不是向上。 –

+0

好的..所以當我們指定長度爲2時,它只會看到舍入的第三個小數點值嗎? –

+0

是的,這就是所有這些舍入函數的定義。 –

回答

6

ROUND()按照它的意圖工作。你指定四捨五入到小數點後兩位,這就是你得到的。

返回數值,舍入到指定的長度或精度。

舍入意味着5位或5位以上的數字上升到最近,小於5位到最近。

所以,

PRINT ROUND(1890.125000, 2) 

產生1890.130000

PRINT ROUND(1890.124999, 2) 

產生1890.120000

2

你的四捨五入問題與SQL Server所使用的舍入算法。我相信SQL Server使用「Round to Even」(有時稱爲Banker's Rounding)算法。 在銀行家的舍入中,如果數字右側的最低有效位數小於5,則數字將被舍入,如果其右側的最低有效位數大於5,則該數字將被舍入。 如果它右側的最低有效數字等於五,那麼五的左邊的數字會四捨五入到最接近的偶數。

在你的1890.124854的例子中,由於四捨五入開始於最右邊的數字並且向左工作,8使得它左邊的4被四捨五入爲5.這五個具有偶數( 2)在它的左邊,因爲它已經是平坦的了,所以它就不存在了。因此,舍入到小數點後兩位應該產生1890.12。 然而,如果你的例子是1890.134854,那麼隨着舍入從右到左工作,8輪舍入4到5,然後5到5的下一個舍入到4的下一個偶數。結果四捨五入到小數點後兩位應該產生1890.14。

理論是1890.125既不接近1890.12或1890.13。它恰好在兩者之間。因此,總是將5位左邊的每個數字四捨五入,會產生不希望的向上偏差,這會導致計算偏向於人爲的較高結果。這種偏差在複雜的計算中變得更加誇張,或者涉及多次迭代的那些偏差,其中五次可能會遇到無數次最不重要的數字。但是,在一般計算中,5左側的數字在統計上可能與偶數相同。正因爲如此,舍入到偶數導致計算的統計懸停接近圓整數的真正平均值。

現在,幾乎所有的事情都使用這種「從頭到尾」的算法。很多年前,我曾經用一種沒有的編程語言來開發。它使用了更加「傳統」的四捨五入,即5號左邊的所有東西都被四捨五入,無論是奇數還是偶數。我們遇到了上面提到的偏置問題。

+1

好吧,所以我剛剛看到了這一點,並且想對我的SQL Server 2014實例(12.0.4100.1)中使用的舍入算法發表評論。它不使用銀行家的舍入算法,但如果重要數字是5,總是舍入。我正在進一步研究這個,看看我能做些什麼來改變它。 –