四舍五入也有个国际惯例,叫奇进偶舍,意思是当舍入位前面一位是奇数时,就进,为偶数时,就舍,这也是体现公平性的原理。可是国际惯例往往在国内很多企业行不通,为了应付他们的要求,采用Math.Round(price,2,MidpointRounding.AwayFromZero)就可以了。

解决方案 »

  1.   


    double d1 = Math.Round(1060.235, 2); //d1 = 1060.23
    double d2 = Math.Round(1060.235, 2, MidpointRounding.ToEven); //d2 = 1060.23
      

  2.   

    double d1 = Math.Round(1060.235+0.005, 2); //这样应该是没问题的吧
      

  3.   

    老外的那叫四舍六入不叫四舍五入…
    如果舍入位为5则看前面一位数,前面一位数如果为偶数则舍入,为奇数则进。小数点后的算法目测还受小数点后第一位数的奇偶影响,MidpointRounding选哪个都无法影响你这个数的四舍五入结果,不过把小数点后的2改成3就行了…
    具体算法都是参照  Banker's rounding
      

  4.   

    http://www.cnblogs.com/love-summer/archive/2011/10/28/2227265.html博客园这里有个示例文章,不过这篇没测试小数位后多位数的问题。
      

  5.   

    http://www.ituring.com.cn/article/35304  这里也有篇参考,看来还比较复杂……
      

  6.   


    MidpointRounding.ToEven 这是IEEE的“四舍五入”。舍位小于等于四的时候,不进位。舍位等于五的时候,看进位上是奇数还是偶数,偶数不进,奇数进一。舍位大于等于六,进位。这是由于浮点数(double或float)的不精确造成的,1.225 这个浮点数常量,在机器内部存储时,可能是 1.22500000000000001,所以被舍入为 1.23 了。 如果用 System.Decimal 数据类型,就没有这个问题了。把1060.235换成1060.235M试试