2015-09-30 27 views
-2

爲什麼下面的代碼返回1299.49?根據msdn文檔,它應該給1299.5。MidpointRounding.AwayFromZero

Console.WriteLine(Math.Round(1299.492, 2, MidpointRounding.AwayFromZero)) 
+5

是什麼讓你覺得它應該給1299.5? 1299.492的中點是1299.49和1299.50的中點? –

+0

感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? @JonSkeet – Pritam

+3

沒有。我建議你仔細閱讀'Math.Round'的文檔。特別是:「一個參數指定如何在兩個數字之間的中間值四捨五入。」 「之間的某處」與「中途之間」不一樣。 –

回答

0

你可能會困惑,如何超負荷工作。據MSDN on MidpointRounding

當數字中間兩個人之間,實際上是朝着那就是遠離零最接近的數字四捨五入。

在你的情況下,1299.492不在1229.49和1299.50之間,所以MidpointRounding.AwayFromZero甚至不適用。


它看起來像你實際上要做的是一輪上漲到最近的2位小數。在這種情況下,你要像this answer

public static double RoundUp(double input, int places) 
{ 
    double multiplier = Math.Pow(10, Convert.ToDouble(places)); 
    return Math.Ceiling(input * multiplier)/multiplier; 
} 

這樣通過(如果你需要2處100)10^places乘以舍入到指定的小數位,呼籲Math.Ceiling,然後分裂。

這工作:

Console.WriteLine(RoundUp(1299.492, 2)); // 1299.5 
+0

感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? – Pritam

+0

@Pritam看到我編輯的答案。 –

1

您舍入到小數點後兩位,因此爲什麼返回1299.49。

如果你想要它是1299.5,舍入到小數點後1位。

Console.WriteLine(Math.Round(1299.492, 1, MidpointRounding.AwayFromZero)) 

大約從AwayFromZero文檔:

當數字中間兩個人之間,實際上是朝着那就是遠離零最接近的數字四捨五入。

https://msdn.microsoft.com/en-us/library/system.midpointrounding(v=vs.110).aspx

+0

感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? – Pritam

+0

@Pritam 1299.492位於這兩個數字之間的某處,但這兩個數字之間不是半角。如果值爲1299.495或更多,它將達到1299.5。 – user1666620

+1

值得注意的是,如果你用1299.495來調用它,你仍然會得到1299.49,因爲1299.495這個字面實際上最終爲1299.4949999999998908606357872486114501953125。 –

相關問題