Math.Round(new decimal(34.965), 2);输出:34.96
 Math.Round(34.965, 2);输出:34.97为什么输出结果不一样!

解决方案 »

  1.   

    在哪里看到过,.net的 round()不是四舍五入
      

  2.   

    C# 中没有四舍五入函数,事实上我知道的程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的
      

  3.   

    这个原因很简单,因为计算机中的数是用二进制存放的,所以表示小数时,精度是不准的,假如是0.1,那在计算机中可能是:0.10000001 或者 0.0999999999 的样子,你把数在 float 与 decimal 之间转换,可能就发生了变化了。
      

  4.   

    这个跟double.Round的具体实现有关。Math.Round(34.965, 2)在内部计算的时候,先乘与100,然后再四舍五入。
    但是由于浮点误差,34.965 * 100 得到的是3496.5000000000005。略大于0.5,于是向上取整。而decimal是用整数来表现的。比如34965,3(其中3表示几个小数)可以用来表示34.965。
    这种情况,就没有必要再乘100了,直接调整小数位然后取整,结果就是.Net默认的向偶数取整。