我有个问题:如何为数值型的变量四舍五入?
例如:
decimal da=(decimal)0.1255;
decimal db=decimal.Parse(da.ToString("0.00"));在转换的时候,必须先转成字符类型,再将字符类型转换成数值型。语句操作比较繁锁,请问有更好的方法没有??

解决方案 »

  1.   

    decimal da=(decimal)0.1255;string db=da.ToString("f0");//四舍五入
      

  2.   

    decimal da=(decimal)0.1255;
    da = (long)(da * 100 + (decimal)0.5) / (decimal)100.0;
      

  3.   

    如下:
    decimal ds;
    Math.Round(ds,3);
      

  4.   

    Decimal aa=Decimal.Round((decimal)1.6,0);","后的值——指定数字要舍入到的小数位数的值,该值范围是从 0 到 28。
      

  5.   

    有没有更简洁的代码吗?我就是因为原来的代码比较麻烦,所以才要找简单些的。
    还有,Math.Round是不能用的。该函数不能用在四舍五入
      

  6.   

    Math.Round可以的,怕不准的话加上一点儿就行了
    da = Math.Round(da + 0.001m,2);
    da = Math.Round(da + 0.0001m,3);
      

  7.   

    用 hzw66(超越理想) 的方法,如果
    da=0.034
    用 Math.Round(da + 0.001m,2)的结果是0.04而不是0.03
      

  8.   

    用round返回的,都跟实际数值有偏差
      

  9.   

    一、四舍五入法
      四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种。
      所谓算术舍入法,就是我们通常意义上的四舍五入法。其规则是:当舍去位的数值大于等于5时,在舍去该位的同时向前位进一;当舍去位的数值小于5时,则直接舍去该位。
      所谓银行家舍入法,其实质是一种四舍六入五留双(又称四舍六入五奇偶)法。其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的同时向前位进一,如果前位数值为偶,则直接舍去该位。
      综上所述,两种舍入法所得结果不尽一致,因此在使用时必须根据实际需要加以区别。否则会出现一些莫明其妙的偏差。
      二、Delphi中的四舍五入函数
      众所周知,Delphi中有一个四舍五入取整函数Round。但它是按银行家舍入法的规则实施舍入操作的,Delphi中没有按算术舍入法规则实施舍入操作的四舍五入取整函数。为此,本人编写了一个基于算术舍入法的四舍五入取整函数RoundEx作为对Delphi的补充。具体实现如下: 
      function RoundEx (const Value: Real): integer;
      var
       x: Real;
      begin
       x := Value - Trunc(Value);
       if x >= 0.5 then
        Result := Trunc(Value) + 1
       else Result := Trunc(Value);
      end; 
    =========================================================================
    其实.Net中的Math.Round()跟Delphi中的四舍五入实现方法是一样的,也是银行家算法。
      

  10.   

    例:下面数字保留三位小数15.16850 => 15.168
    15.16950 => 15.170
    15.16851 => 15.169
      

  11.   

    谢谢 rcom10002(KNIGHTRCOM),
    没想到四舍五入都有这个误区啊
      

  12.   

    楼主测一下        Private Function RoundEnhance(ByVal value As Decimal, ByVal length As Integer) As Decimal
                Dim dotIndex As Integer = value.ToString.IndexOf(".")
                Dim subLen As Integer = dotIndex + length + 2
                Dim valueLen As Integer
                value = CDec(value.ToString.Substring(0, subLen))
                valueLen = value.ToString.Length
                If value.ToString.Substring(valueLen - 1, 1) = "5" Then
                    value = CDec(value.ToString.Substring(0, valueLen - 1))
                    valueLen = value.ToString.Length
                    Return CDec(value.ToString.Substring(0, valueLen - 1) + CStr(CInt(value.ToString.Substring(valueLen - 1, 1)) + 1))
                End If
                Return Math.Round(value, length)
            End Function
      

  13.   

    不好意思,刚才才写了个0,应该是这样:
    da = Math.Round(da + 0.0001m,2);
    da = Math.Round(da + 0.00001m,3);
      

  14.   

    看错版了有问题的地方你自己改吧,基本能用 private decimal RoundEnhance(decimal value, int length) 

    int dotIndex = Convert.ToString(value).IndexOf("."); 
    int subLen = dotIndex + length + 2;
    int valueLen;
    value = System.Convert.ToDecimal(Convert.ToString(value).Substring(0, subLen)); 
    valueLen = Convert.ToString(value).Length; 
    if (Convert.ToString(value).Substring(valueLen - 1, 1) == "5") 

    value = System.Convert.ToDecimal(Convert.ToString(value).Substring(0, valueLen - 1)); 
    valueLen = Convert.ToString(value).Length; 
    return System.Convert.ToDecimal(Convert.ToString(value).Substring(0, valueLen - 1) + System.Convert.ToString(System.Convert.ToInt32(Convert.ToString(value).Substring(valueLen - 1, 1)) + 1)); 

    return Math.Round(value, length); 
    }
      

  15.   

    看了rcom10002(KNIGHTRCOM)的代码,比我原来的代码复杂了很多。:-)decimal da=(decimal)0.1255;
    decimal db=decimal.Parse(da.ToString("0.00"));
    不过非常感谢 rcom10002(KNIGHTRCOM)
      

  16.   

    to  hzw66(超越理想) :
    你的方法还是不行,如果我的数值是
    0.0349,
    那么Math.Round(da + 0.0001m,2)返回的是0.04,还是错误