2014-11-04 118 views
0

我嘗試了一切,但無法將非常長的十進制值(指數)轉換爲小數點後6位的負值。C#四捨五入負指數雙值

string str = "-1.7976931348623157E+308"; 
double d = double.Parse(str); 
d = Math.Round(d, 6, MidpointRounding.AwayFromZero); 
string str2 = d.ToString(); 

我想要結果爲-1.797693,就這麼簡單!

+8

你明白' 「-1.7976931348623157E + 308」''是用-1.797693'在它前面307零,是正確的?你如何看待四捨五入到-1.797693? – LittleBobbyTables 2014-11-04 20:10:52

+0

C#有一個十進制值,您應該使用它。如果你只是想將其格式化爲輸出,你可以使用d.ToString(「#。######」); – 2014-11-04 20:18:29

+0

@LittleBobbyTables - 是的,我明白。讓我簡單地回答這個問題 - 我的要求說價值應該顯示爲-1.797693。感謝您的迴應。 – Eyedia 2014-11-05 21:58:15

回答

2

請注意,正如LittleBobbyTables所建議的那樣,1.xxE+308將不會轉爲1.xx。但是,假設你不是那個意思,你只是試圖構建你的輸出:

string str2 = d.ToString("E6"); 

E6數是你想要的E符號之前顯示的數字量。

對於上述示例,str2將具有值"-1.797693E+308"

如果你確實需要你的價值四捨五入(我不確定爲什麼你會 - 爲什麼扔掉精度?這不會妨礙你),你應該保持你的Round電話,因爲它站在上面。

+0

謝謝。但正如我上面提到的...我的要求說,價值應該顯示爲「-1.797693」。什麼是最好的方式來做到這一點? – Eyedia 2014-11-05 22:00:49

+0

@ user2502938這沒有任何意義 - 沒有真正的方法可以做到這一點,因爲沒有邏輯可以將指數從科學標記的值中剝離出來。 「-1.797693」對於具有308個附加零的相同數字意味着什麼?你甚至想要完成什麼? – furkle 2014-11-05 22:18:32

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

+0

請注意,顯然他不想'179.7693e306',而是'179.7693',沒有指數。不知道爲什麼,但也許你的口袋裏也有東西。 – furkle 2014-11-06 15:03:41

+0

@ ja72 - 感謝分享代碼。是的,正如furkle提到我需要這個179.7693。 但我不明白爲什麼大家都在質疑這個要求?如果需求說我們需要它,我們需要它......對嗎?我們知道我們將丟失所有小數點細節,但這就是我們想要的。 – Eyedia 2014-11-17 16:43:44