关于c#的四舍五入问题
2009-09-09 11:51
274 查看
下面是网上流传的关于c#的四舍五入的程序代码:
public static double Round(double d, int i)
{
if (d >= 0)
{
d += 5 * Math.Pow(10, -(i + 1));
}
else
{
d += -5 * Math.Pow(10, -(i + 1));
}
string str = d.ToString();
string[] strs = str.Split('.');
int idot = str.IndexOf('.');
string prestr = strs[0];
string poststr = strs[1];
if (poststr.Length > i)
{
poststr = str.Substring(idot + 1, i);
}
string strd = prestr + "." + poststr;
d = Double.Parse(strd);
return d;
}
关于这段代码其实是有Bug的。Bug的原因是当double的类型d是100.0时的时候。。也就是说正好小数点后面是0的情况下,那么d.ToString()得出来的结果是100....那么此时的strs数组的长度将为1。。。即string poststr = strs[1]; 这一句将会抛出数组越界的异常。因此要做如下简单的修改:
string str = value.ToString();
string[] strs = str.Split('.');
int idot = str.IndexOf('.');
if (idot > 0)
{
string prestr = strs[0];
string poststr = strs[1];
if (poststr.Length > decimals)
{
poststr = str.Substring(idot + 1, decimals);
}
string strd = prestr + "." + poststr;
value = Double.Parse(strd);
}
else
{
value = Double.Parse(str);
}
public static double Round(double d, int i)
{
if (d >= 0)
{
d += 5 * Math.Pow(10, -(i + 1));
}
else
{
d += -5 * Math.Pow(10, -(i + 1));
}
string str = d.ToString();
string[] strs = str.Split('.');
int idot = str.IndexOf('.');
string prestr = strs[0];
string poststr = strs[1];
if (poststr.Length > i)
{
poststr = str.Substring(idot + 1, i);
}
string strd = prestr + "." + poststr;
d = Double.Parse(strd);
return d;
}
关于这段代码其实是有Bug的。Bug的原因是当double的类型d是100.0时的时候。。也就是说正好小数点后面是0的情况下,那么d.ToString()得出来的结果是100....那么此时的strs数组的长度将为1。。。即string poststr = strs[1]; 这一句将会抛出数组越界的异常。因此要做如下简单的修改:
string str = value.ToString();
string[] strs = str.Split('.');
int idot = str.IndexOf('.');
if (idot > 0)
{
string prestr = strs[0];
string poststr = strs[1];
if (poststr.Length > decimals)
{
poststr = str.Substring(idot + 1, decimals);
}
string strd = prestr + "." + poststr;
value = Double.Parse(strd);
}
else
{
value = Double.Parse(str);
}
相关文章推荐
- c# 关于取小数点后值四舍五入精度问题
- 关于c#double型数据四舍五入的问题
- 关于c#double型数据四舍五入的问题
- unity3d 关于c#命名空间引用问题
- 关于在前台页面插入C#代码的问题,导致页面不完全显示
- c# winform 关于给静态全局变量赋值的问题
- 关于C#中用access做数据库,使用like语句的问题(转)
- 关于C#中的DateTime类型的细节问题
- 关于C#基类和子类函数调用问题
- 关于C++和C#选择的问题---ShinePans
- [备忘]关于C#引用Dll后,找不到命名空间的问题
- 关于C# DATAGRIDVIEW select 后绑定数据源顺序混乱的问题
- 关于批量数据更新的问题(C#高性能)
- [C#]关于DLL使用.exe.config 的问题,也许以下描述有一点帮助
- 关于C#下面windows服务读取注册表的问题
- c# 关于基类和子类的方法调用问题--总结
- 关于判断C#的两个string是否相等的问题
- 关于C#程序路径的问题
- 做项目时遇到的几个关于C#和SQL的细节问题(二)
- 关于C#Image.FromFile文件不释放问题的解决