我有个问题:如何为数值型的变量四舍五入?
例如:
decimal da=(decimal)0.1255;
decimal db=decimal.Parse(da.ToString("0.00"));在转换的时候,必须先转成字符类型,再将字符类型转换成数值型。语句操作比较繁锁,请问有更好的方法没有??
例如:
decimal da=(decimal)0.1255;
decimal db=decimal.Parse(da.ToString("0.00"));在转换的时候,必须先转成字符类型,再将字符类型转换成数值型。语句操作比较繁锁,请问有更好的方法没有??
da = (long)(da * 100 + (decimal)0.5) / (decimal)100.0;
decimal ds;
Math.Round(ds,3);
还有,Math.Round是不能用的。该函数不能用在四舍五入
da = Math.Round(da + 0.001m,2);
da = Math.Round(da + 0.0001m,3);
da=0.034
用 Math.Round(da + 0.001m,2)的结果是0.04而不是0.03
四舍五入是一种应用非常广泛的近似计算方法,其有算术舍入法和银行家舍入法两种。
所谓算术舍入法,就是我们通常意义上的四舍五入法。其规则是:当舍去位的数值大于等于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中的四舍五入实现方法是一样的,也是银行家算法。
15.16950 => 15.170
15.16851 => 15.169
没想到四舍五入都有这个误区啊
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
da = Math.Round(da + 0.0001m,2);
da = Math.Round(da + 0.00001m,3);
{
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);
}
decimal db=decimal.Parse(da.ToString("0.00"));
不过非常感谢 rcom10002(KNIGHTRCOM)
你的方法还是不行,如果我的数值是
0.0349,
那么Math.Round(da + 0.0001m,2)返回的是0.04,还是错误