对一个数进行四舍五入时,我们通常是使用Math.Round方法,但是有时不能出现我们期待的结果,比如说2.5在四舍五入后的结果仍然是2。今天仔细看了一下VS的文档才豁然开朗:

  1.  Math.Round的重载方法:

    • Math.Round(Double);将双精度浮点值舍入到最接近的整数
    • Math.Round(Double,Int32);将双精度浮点值舍入到指定精度
    • Math.Round(Double,MidpointRounding);将双精度浮点值按指定的方法舍入为最接近的整数
    • Math.Round(Double,Int32,MidpointRounding);将双精度浮点值按指定的方法舍入到指定精度
  2. MidpointRounding值:
    • AwayFromZero:当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较大的值
    • ToEven:当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。

在dot Net 1.0 / 1.1中只是使用前面的两个方法,他们相当于后面两个相对应的方法的MidpointRounding为ToEven,在dot Net 2.0中可以使用以上全部的方法;

回过头来看,2是最接近2.5的偶数,因此在dot Net 1.0/1.1中才会出现2.5在四舍五入后的结果为2。而我们想使用真正的“逢五进位”就应该让MidpointRounding为AwayFromZero(只能在dot Net 2.0中实现)。