虽然我在网上也搜索到有关Round是使用 银行家舍入法
四舍六入五取双但是我遇到的这个数字也太怪了吧Math.Round(5.425, 2)
5.42
Math.Round(6.425, 2)
6.42
Math.Round(7.425, 2)
7.42
Math.Round(8.425, 2)
8.43
Math.Round(9.425, 2)
9.43同样的小数位,前面整数位不同就得到的结果不同
其实原来的问题是:我有一笔数:6125.00,正好拆成下面两个数字
2213.575
3911.425结果对他们俩做Math.Round,得到的结果居然是
2213.57
3911.42加起来比原数少了0.01
按照银行家舍入法也应该有一个会进位我实在搞不明白

解决方案 »

  1.   

    诶,Round支持银行家算法。不过好像貌似有个参数。你用错方法了。
      

  2.   

    Round函数就是这个意思,截取几位,
      

  3.   

    ROUND
    返回数字表达式并四舍五入为指定的长度或精度。语法
    ROUND ( numeric_expression , length [ , function ] ) 参数
    numeric_expression精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。length是 numeric_expression 将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当 length 为正数时,numeric_expression 四舍五入为 length 所指定的小数位数。当 length 为负数时,numeric_expression 则按 length 所指定的在小数点的左边四舍五入。function是要执行的操作类型。function 必须是 tinyint、smallint 或 int。如果省略 function 或 function 的值为 0(默认),numeric_expression 将四舍五入。当指定 0 以外的值时,将截断 numeric_expression。
      

  4.   

    SELECT Round(5.425,2,0) 
    SELECT Round(5.425,2,1) 
           
    ------ 
    5.430(所影响的行数为 1 行)       
    ------ 
    5.420(所影响的行数为 1 行)SQL里面的解释
      

  5.   

    你把数据类型转换为decimal类型就正确了
    this.Text = Math.Round(2213.575M ,2 ).ToString()+" "+ Math.Round(3911.425M, 2).ToString();
    这是因为double类型2213.575在计算机上存储为2213.5750000000000000000000000000000000000000000001
    而3911.425为3911.424999999999999999999999999999999999999999
     而decimal就会得到正确的,msdn上解释如下
    decimal 关键字表示 128 位数据类型。同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。
    http://www.mybuffet.cn
      

  6.   

    double型数据在计算机中是以二进制来储存的,十进制有限小数多数情况不能精确地用二进制小数表示。对于5.425、6.425、7.425,用double型数据表示比实际数值要略小一点,所以结果是.42;对于8.425、9.425,用double型数据表示比实际数值要略大一点,所以结果是.43。
    改成用decimal就不会有这种问题了。
      

  7.   

    你的写法有问题
    正确语法:
    ROUND ( numeric_expression , length [ , function ] ) 
      

  8.   

    你用错方法了,应该用带midpointrounding那个参数的方法而不是int32的那个
      

  9.   

    这个帖子讨论的很好!?
    http://topic.csdn.net/u/20100120/09/65df734a-05cb-441a-b740-45cb3dfb7f8c.html
      

  10.   

    使用Math.Round()函数时,程序提示的数据类型为decimal,即浮点型数据;所以在使用此函数前首先定义一个decimal 类型变量,在使用是不会出现你的上述问题的。Math.Round()函数就是实现一个奇进偶不进的功能。如:Math.Round(2.355,2)=2.36;Math.Round(2.345,2)=2.34;
      

  11.   

    5楼 6楼说的应该没错,虽然我还没来及测试可能怪我没说清楚, SQL77 说的似乎不是 C# 的函数。