我尝试了所有方法,但无法将具有非常长的十进制值(指数)的负双值向上舍入为6位小数。
string str = "-1.7976931348623157E+308";
double d = double.Parse(str);
d = Math.Round(d, 6, MidpointRounding.AwayFromZero);
string str2 = d.ToString();
我希望结果为-1.797693,就像那样简单!
答案 0 :(得分:2)
请注意,正如LittleBobbyTables所暗示的那样,1.xxE+308
无法转向1.xx
。但假设你没有意思,并且你只是试图构建你的输出:
string str2 = d.ToString("E6");
E6
中的数字是您希望在E表示法之前显示的数字量。
对于上面的示例,str2
的值为"-1.797693E+308"
。
如果你真的需要你的价值四舍五入(而且我不确定你为什么会这样 - 为什么要抛弃精确?它不会妨碍你),你应该保留你的{{ 1}}如上所述调用。
答案 1 :(得分:0)
我根据significant digits的数量写了这个代码:
/// <summary>
/// Format a number with scientific exponents and specified sigificant digits.
/// </summary>
/// <param name="x">The value to format</param>
/// <param name="significant_digits">The number of siginicant digits to show</param>
/// <returns>The fomratted string</returns>
public static string Sci(this double x, int significant_digits)
{
//Check for special numbers and non-numbers
if (double.IsInfinity(x)||double.IsNaN(x)||x==0)
{
return x.ToString();
}
// extract sign so we deal with positive numbers only
int sign=Math.Sign(x);
x=Math.Abs(x);
// get scientific exponent, 10^3, 10^6, ...
int sci=(int)Math.Floor(Math.Log(x, 10)/3)*3;
// scale number to exponent found
x=x*Math.Pow(10, -sci);
// find number of digits to the left of the decimal
int dg=(int)Math.Floor(Math.Log(x, 10))+1;
// adjust decimals to display
int decimals=Math.Min(significant_digits-dg, 15);
// format for the decimals
string fmt=new string('0', decimals);
if (sci==0)
{
//no exponent
return string.Format("{0}{1:0."+fmt+"}",
sign<0?"-":string.Empty,
Math.Round(x, decimals));
}
int index=sci/3+6;
// with 10^exp format
return string.Format("{0}{1:0."+fmt+"}e{2}",
sign<0?"-":string.Empty,
Math.Round(x, decimals),
sci);
}
这样Debug.WriteLine((-1.7976931348623157E+308).Sci(7));
会产生-179.7693e306