2010-09-06 61 views
3

我運行這段代碼:Math.Round十進制

decimal d = 1.45M; 

Console.WriteLine((System.Math.Round(d,0,MidpointRounding.AwayFromZero).ToString())); 

在這裏,我希望可以將輸出爲2,因爲1.45時四捨五入至小數點第1地點將是1.5,當旁邊四捨五入到0位小數應2.

但是,我得到的答案爲1

是我的假設是正確的?如果是這樣,這是Math.Round的錯誤嗎?

回答

8

不,這不是一個錯誤。你的邏輯談論兩次四捨五入 - 但你只有一個電話Round。 1.45小於1和2(1.5),所以它向下調整至1

如果你想要的代碼按照你的邏輯之間的中點,你可以這樣做:

using System; 

class Test 
{ 
    static void Main() 
    { 
     decimal d = 1.45m; 
     d = Math.Round(d, 1, MidpointRounding.AwayFromZero); // 1.5 
     d = Math.Round(d, 0, MidpointRounding.AwayFromZero); // 2 

     Console.WriteLine(d); 
    } 
} 

除非你指定,你想要兩個舍入階段雖然(如上).NET將只做一個。

+0

請運行這個 – PrateekSaluja 2010-09-06 08:52:33

+0

d = Math.Round(d,0,MidpointRounding.AwayFromZero); 輸出將是1不是2. – PrateekSaluja 2010-09-06 08:53:06

+1

@ prateeksaluja20:我跑了它。結果是2.請記住,當Math.Round的第二次調用運行時,'d'爲1.5m ...將第一次調用的結果記錄到'd'中。 – 2010-09-06 08:55:33

0

你不能做'圓'行動一位數字!在這裏,您說:

1.45 rounded to 1 decimal place:1.5 
1.5 rounded to 0 decimal place:2 

這是不正確的,這裏1.45四捨五入到0的數字,你只需要檢查0.4。

0

你的理解是不正確的。

您已指定小數值爲0,因此提供的值將四捨五入爲整數值。

來自MSDN「如果d中小數位右側第一個數字的值爲5,則小數位中的數字如果是奇數則向上取整,如果它是甚至」

作爲第一個值小數點右邊是4,不是五個,然後返回的值是1。

如果十進制值已經成爲1.55,那麼答案將是2

如果十進制值是2.55,那麼答案也會是2!

由於您正在指定中點舍入行爲,所以這將會改變,但是當您要求該回合使用小數= 0時,它只會檢查小數點後面的第一個數字。

逸岸,如果你指定的小數位= 1爲

Math.Round(1.45,1) 

然後你的答案是1.4,因爲它的小數點的第一個圓後,檢查第二位。