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

Другие вопросы по тегам