最近遇到问题是保留三位有效数字而不是保留三位小数。
例如:
输入:1234 输出:1234
1234.3 1234
12 12.0
4 4.00
1.3 1.30
1.235 1.24
1.245 1.24
0.001 0.00100
整理一下我找到的一些代码:
double是值,int是保留位数
方法1:
public double Retain(double d, int n)
{
if (d == 0.0) return 0;
if (d > 1 || d < -1)
n = n - (int)Math.Log10(Math.Abs(d)) - 1;
else
n = n + (int)Math.Log10(1.0 / Math.Abs(d));
if (n < 0)
{
d = (int)(d / Math.Pow(10, 0 - n)) * Math.Pow(10, 0 - n);
n = 0;
}
return Math.Round(d, n);
}
2.用“G”的精度表示保留有效数字位数,例如保留4位
///保留4位有效数字
var arr = new double[] { 123.4567, 12345670, 12.34567, 0.001234567 };
foreach (var d in arr)
Console.WriteLine(d.ToString("G4"));
//输出结果
123.5
1.235E+07
12.35
0.001235
3.考虑到数据有可能整数,还有用“G”的精度表示保留有效数字位数子时,0多的数据会按科学计数法形式+“E”的数据。
/// <summary>
/// 保留有效数字
/// </summary>
/// <param name="bef"></param>
/// <param name="digit"></param>
/// <returns></returns>
public static string ReturnBef(double bef, int digit)
{
if (bef == 0)
{
return "0";
}
var res = bef.ToString($"G{digit}");//G精度
if (res.Contains("."))
{
var index = Regex.Match(res, "([1-9])").Index;
var sub = res.Substring(index).Replace(".", "");
var leg = sub.Length;
while (leg < digit)
{
res += "0";
leg++;
}
}
else
{
int leg = res.ToString().Length;
if (leg >= digit)
{
return res;//返回整数
}
else
{
res += ".";
while (leg < digit)
{
res += "0";
leg++;
}
}
}
return res;
}
///阻止科学计数法
public static class FormatStrings
{
public const string DoubleFixedPoint = "0.###################################################################################################################################################################################################################################################################################################################################################";
}
例子:
string n1 = ReturnBef(Convert.ToDouble(o.INQ), 3).ToString();
if (n1.Contains("E"))//判是否包含“E”
GridView.Rows[row].Cells["INQ"].Value = (Convert.ToDouble(a).ToString(FormatStrings.DoubleFixedPoint));
else
GridView.Rows[row].Cells["INQ"].Value = ReturnBef(Convert.ToDouble(a), 3);
4.有些数值没有进入方法,改进把精度取消
public static string Rtues(double bef, int digit)
{
if (bef == 0)//判断是否为0
{
return 0.ToString();
}
var res = bef.ToString();
if (res.Contains("."))//判断小数
{
var index = Regex.Match(res, "([1-9])").Index;//
var sub = res.Substring(index).Replace(".", "");
var leg = sub.Length;
while (leg < digit)
{
res += "0";
leg++;
}
}
else//判断整数
{
int leg = res.Length;
if (leg >= digit)
{
return res;
}
else
{
res += ".";
while (leg < digit)
{
res += "0";
leg++;
}
}
}
return res;
}
转载 https://blog.csdn.net/pixiuz/article/details/124836634