爲什麼下面的代碼返回1299.49?根據msdn文檔,它應該給1299.5。MidpointRounding.AwayFromZero
Console.WriteLine(Math.Round(1299.492, 2, MidpointRounding.AwayFromZero))
爲什麼下面的代碼返回1299.49?根據msdn文檔,它應該給1299.5。MidpointRounding.AwayFromZero
Console.WriteLine(Math.Round(1299.492, 2, MidpointRounding.AwayFromZero))
你可能會困惑,如何超負荷工作。據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
感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? – Pritam
@Pritam看到我編輯的答案。 –
您舍入到小數點後兩位,因此爲什麼返回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
感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? – Pritam
@Pritam 1299.492位於這兩個數字之間的某處,但這兩個數字之間不是半角。如果值爲1299.495或更多,它將達到1299.5。 – user1666620
值得注意的是,如果你用1299.495來調用它,你仍然會得到1299.49,因爲1299.495這個字面實際上最終爲1299.4949999999998908606357872486114501953125。 –
是什麼讓你覺得它應該給1299.5? 1299.492的中點是1299.49和1299.50的中點? –
感謝您的回覆。但是我仍然對此感到困惑,因爲1299.492介於1299.49和1299.50之間。所以在小數點後兩位應該給我1299.50這是正確的嗎? @JonSkeet – Pritam
沒有。我建議你仔細閱讀'Math.Round'的文檔。特別是:「一個參數指定如何在兩個數字之間的中間值四捨五入。」 「之間的某處」與「中途之間」不一樣。 –