我试图使用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中所述?
舍入操作采用隐含或指定精度的原始数字;检查下一个数字,即精度加一;并返回最接近的数字,其精度与原始数字相同。
答案 0 :(得分:2)
行为是正确的。您认为4.50001,4.51,4.59,4.599999999999应该全部向下舍入到4.显然,4.5以上的数字比4更接近5,因此应该四舍五入为5.