Math.Round(35.035, 2, MidpointRounding.ToEven) // returns: 35.03
以上据我所知,它应该将数字四舍五入到小数点后两位。该数字介于两个数字35.03
和35.04
之间。
所以我指定舍入到目前为止,据我所知,这意味着最后一个小数位应该是均匀的,所以我期望它舍入到最接近的35.04
。
有人可以向我解释为什么它会在最后一个小数位上舍入到奇数吗?
答案 0 :(得分:3)
当您表示小数时,您需要m
或M
,否则会导致逼近错误。
尝试Math.Round(35.035m, 2, MidpointRounding.ToEven)
不同数据类型的后缀
float f = 1.2f;
double d = 1.2d;
uint u = 2u;
long l = 2L;
ulong ul = 2UL;
decimal m = 2m;
答案 1 :(得分:1)
请参阅http://msdn.microsoft.com/en-us/library/f5898377.aspx
您可以找到以下内容:
来电者须知
由于将十进制值表示为浮点数或对浮点值执行算术运算会导致精度损失,因此在某些情况下Round(Double,Int32,MidpointRounding)方法可能看起来不是圆中点mode参数指定的值。这在以下示例中说明,其中2.135舍入为2.13而不是2.14。发生这种情况是因为内部方法将值乘以10digits,在这种情况下乘法运算会受到精度损失的影响。
使用带小数的Math.Round作为第一个值可以解决问题,但需要花费类型转换的费用。