0

我正在尝试使用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

1 回答 1

2

行为是正确的。您认为 4.50001、4.51、4.59、4.599999999999 应该全部舍入到 4。很明显,4.5 以上的数字比 4 更接近 5,因此应该向上舍入到 5。

于 2014-02-20T08:21:44.983 回答