C# Округление отрицательного экспоненциального двойного значения
Я перепробовал все, но не смог округлить отрицательное двойное значение с очень длинным десятичным значением (экспоненциальным) до 6 десятичных.
string str = "-1.7976931348623157E+308";
double d = double.Parse(str);
d = Math.Round(d, 6, MidpointRounding.AwayFromZero);
string str2 = d.ToString();
Я хочу, чтобы результат как -1,797693, так просто!
2 ответа
Обратите внимание, что, как предлагает LittleBobbyTables, нет никакого способа 1.xxE+308
собирается округлить до 1.xx
, Но предположим, что вы не имели в виду это, и вы просто пытаетесь структурировать свой вывод:
string str2 = d.ToString("E6");
Где число в E6
количество цифр, которое вы хотите отобразить перед E-нотацией.
Для вашего примера выше, str2
будет иметь значение "-1.797693E+308"
,
Если вам действительно нужно, чтобы ваше значение было округлено (и я не совсем уверен, почему вы - зачем выбрасывать точность? Это не помешает вам), вы должны сохранить Round
звоните, как оно стоит выше.
Вы этот код я написал для раунда на основе количества значащих цифр:
/// <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