在最近版本的Delphi Pascal 編譯器中,Round 函數是以 CPU 的 FPU (浮點部件) 處理器為基礎的。這種處理器采用了所謂的 "銀行家舍入法",即對中間值 (如 5.5、6.5) 實施Round函數時,處理器根據小數點前數字的奇、偶性來確定舍入與否,如 5.5 Round 結果為 6,而 6.5 Round 結果也為6, 因為 6 是偶數。
對於XXX.5的情況,整數部分是奇數,那么會Round Up,偶數會Round Down,例如:
x:= Round(17.5) = x = 18
x:= Round(12.5) = x = 12
一、四舍五入法
四舍五入是一種應用非常廣泛的近似計算方法,其有算術舍入法和銀行家舍入法兩種。
所謂算術舍入法,就是我們通常意義上的四舍五入法。其規則是:當舍去位的數值大於等於5時,在舍去該位的同時向前位進一;當舍去位的數值小於5時,則直接舍去該位。
所謂銀行家舍入法,其實質是一種四舍六入五留雙(又稱四舍六入五奇偶)法。其規則是:當舍去位的數值小於5時,直接舍去該位;當舍去位的數值大於等於6 時,在舍去該位的同時向前位進一;當舍去位的數值等於5時,如果前位數值為奇,則在舍去該位的同時向前位進一,如果前位數值為偶,則直接舍去該位。
綜上所述,兩種舍入法所得結果不盡一致,因此在使用時必須根據實際需要加以區別。否則會出現一些莫明其妙的偏差。
二、Delphi中的四舍五入函數
眾所周知,Delphi中有一個四舍五入取整函數Round。但它是按銀行家舍入法的規則實施舍入操作的,Delphi中沒有按算術舍入法規則實施舍入操 作的四舍五入取整函數。為此,本人編寫了一個基於算術舍入法的四舍五入取整函數RoundEx作為對Delphi的補充。具體實現如下:
function RoundClassic(R: Real): Int64; begin Result:= Trunc(R); if Frac(R) >= 0.5 then Result:= Result + 1; end;
-------------------------
世界上的許多國家已廣泛采用“四舍六入法”。我國國家科委於1955年就作了推薦。“四舍 六入法”可以概括為:“四舍六入五考慮,五后非零就進一,五后皆零看奇偶,五前為偶應舍 去,五前為奇要進一。”
好像短一點的口訣叫“四舍、六入、五湊偶”
據說歐洲銀行全采用這個模式
這個都不知道,四舍六入五成雙,Round都是這樣處理的。
我也遇到過這個問題,起初也很奇怪,后來看了幫助,果然是四舍六入五靠偶,雖然樓上的所說的四舍六入是國際標准,但是中國的很多業務系統還是采取的是四舍 五入的方法,沒辦法,我只好自己寫了個方法來四舍五入了。不過網上有一個不錯的方法,雖然有取巧嫌疑,但是一般沒什么問題,就是在后面加上 0.0000000001,很小的一個數,這時再來取兩位,三位或四位就基本沒問題了。可以試試
四舍六入五成雙,是為了使大量數據求平均值更加精確
俺也是今天才發現“四舍、六入、五湊偶”,感謝有心的樓
“四舍、六入、五湊偶”比較經典哎~~