2011-06-19 41 views
1

想知道在Excel上使用Round()函數時應用了哪種舍入方法? 當您選擇將列格式化爲帶有兩位小數的貨幣時,也有不同之處。 我需要在我編寫的C#程序中模擬Excel的結果。MS Excel貨幣舍入方法

+0

你自己做過任何測試嗎? –

回答

3

注意:Excel和Excel-VBA使用兩種不同的算法。

在Excel:

=ROUND(0.5,0)返回1

=ROUND(1.5,0)返回2.

在Excel-VBA:

Print Round(0.5,0) 
0 
Print Round(1.5,0) 
2 

VBA使用銀行家的舍入:舍入0.5的至最接近的甚至整數。請注意,如果您將Round更改爲小數點後的位置,則相同的邏輯將轉換爲低位小數位。例如,Round(0.05,1)在Excel-VBA中返回零(與Excel中的0.1相反)。

這是我最不喜歡的VBA功能之一。它與Excel不一致使它更糟糕。

數字格式對此問題沒有影響。

+0

謝謝,我不知道這個問題+1。在vba中,我會想象使用WorksheetFunction.Round(myRng,0)可能是保持直線的好選擇嗎? – datatoo

+0

@datatoo:的確,有一點要注意,從VBA訪問Excel的工作表函數會產生一些開銷,如果你舍入*許多數字,會影響性能。但是如果你只用了很少的幾次,那很好,'WorksheetFunction.Round(0.5,0)'將返回1,就像你期望的那樣。 –

+1

另一個可怕的,醜陋的解決方法是'CDbl(格式(0.5,「0」))',即轉換爲字符串使用'格式'(這與'Round'相反,由於某種原因不使用銀行家舍入),然後使用'CDbl'回到'Double'。令人驚訝的是,這比「WorksheetFunction.Round」快!在我的舊機器上,用VBA對1000萬個數字進行舍入處理需要2秒鐘的時間,這個循環是快速的,但是使用愚蠢的銀行家舍入,20秒鐘使用CDbl(格式爲0.5,使用'WorksheetFunction.Round'! –