簡體   English   中英

指定小數位數時,Math.Round與MidpointRounding.ToEven的行為是否正確?

[英]When specifying the number of decimals, is the behaviour of Math.Round with MidpointRounding.ToEven correct?

我正在嘗試使用Math.Round但是我得到的結果並不是我所期望的。 我發現只有當下面的數字是5並且之后不能有任何其他數字時,它才會四舍五入。

Assert.AreEqual<double>(4d, Math.Round(4.5));          // Pass
Assert.AreEqual<double>(5d, Math.Round(4.6));          // Pass
Assert.AreEqual<double>(6d, Math.Round(5.5));          // Pass
Assert.AreEqual<double>(4d, Math.Round(4.500001));     // Fail - 5
Assert.AreEqual<double>(4d, Math.Round(4.45));         // Pass
Assert.AreEqual<double>(4.4, Math.Round(4.45, 1));     // Pass
Assert.AreEqual<double>(4.4, Math.Round(4.450001, 1)); // Fail - 4.5 

Decimal.Round的行為也是相同的。

Assert.AreEqual<decimal>(4m, Decimal.Round(4.500001m));      // Fail - 5
Assert.AreEqual<decimal>(4.4m, Decimal.Round(4.450001m, 2)); // Fail - 4.5

不應該舍入只考慮正在舍入的小數位后面的數字,如MidpointRounding中所述

舍入操作采用隱含或指定精度的原始數字; 檢查下一個數字,即精度加一; 並返回最接近的數字,其精度與原始數字相同。

行為是正確的。 您認為4.50001,4.51,4.59,4.599999999999應該全部向下舍入到4.顯然,4.5以上的數字比4更接近於5,因此應該四舍五入為5。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM