我正在尝试使用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中所述,舍入不应该只考虑您要舍入到的小数位之后的数字吗?
舍入运算采用隐含或指定精度的原始数字;检查下一个数字,即该精度加一;并返回与原始数字具有相同精度的最接近的数字。