2014-12-04 66 views
0

我想將一個浮點數轉換爲它的字符串表示形式,而不會出現在科學記數法中的結果。浮動到字符串使用往返

我第一次嘗試:

ToString("0." + new string('#', 7)) 

但這似乎並沒有對大的值正常工作。例如:

float largeNumber = 12345678f; 
string str = largeNumber.ToString("0." + new string('#', 7)); 

結果"12345680"

我又試圖ToString("R")

這個工程的大量之上,但如果數字過於大,它們顯示在科學記數法。例如5000000000f結果爲"5E+09"。和小數字如0.0005導致0.0004999999966

我也試過混合2,但在某些情況下我仍然得到科學記數法。

我的測試程序粘貼在下面。我明白,會有精確的問題,但我想知道我能做得比我有什麼更好嗎?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Write(0.123456789f); 
     Write(0.12345678f); 
     Write(0.1234567f); 
     Write(0.123456f); 
     Write(0.12345f); 
     Write(0.1234f); 
     Write(0.123f); 
     Write(0.12f); 
     Write(0.1f); 
     Write(1); 
     Write(12); 
     Write(123); 
     Write(1234); 
     Write(12345); 
     Write(123456); 
     Write(1234567); 
     Write(12345678); 
     Write(123456789); 

     Console.WriteLine(); 

     float f = 5000000000f; 
     for (int i = 0; i < 17; ++i) 
     { 
      Write(f); 
      f /= 10; 
     } 

     Console.WriteLine(); 

     f = 5000000000f; 
     for (int i = 0; i < 17; ++i) 
     { 
      Write(f < 1 ? f + 1 : f); 
      f /= 10; 
     } 

     Console.Read(); 
    } 

    static void Write(float f) 
    { 
     //string str = f.ToString("0." + new string('#', 7)); 
     //string str = f.ToString("R"); 
     string str = Math.Abs(f) < 1 ? f.ToString("0." + new string('#', 7)) : f.ToString("R"); 

     Console.WriteLine(str); 
    } 
} 

回答

0

格式字符串的0不是零,它代表着「數字如果非零和零,如果零」,而「#」代表「數字如果不爲零或什麼,如果零」。

您可以使用格式f.ToString("0." + new string('#', 7))換號了零

我只是測試它在PowerShell和它的作品對我很好,儘管它可能採用雙打或小數:

PS C:\> $test = "{0:0.0######}" 
PS C:\> $test -f 0.5 
0,5 
PS C:\> $test -f 0.4443423 
0,4443423 
PS C:\> $test -f 123.4443423 
123,4443423 
PS C:\> $test -f 45425123.4443423 
45425123,4443423 

當然,這個問題似乎是float精度:

PS C:\> $test -f [float]45425123.4443423 
45425120,0 
2

的問題是,float只支持精度7位。無法在浮點數中精確地表示12345678f,因此它將轉換爲最接近的可表示浮點值,即12345680f。這不是數字的大小,而是關鍵問題的精度位數。

另外,0.0005不能用表示,用二進制浮點數表示;最接近的8位二進制浮點數到0.00050.0004999999966

decimal支持更高的精確度,並能精確地使用標準N格式說明表示底數爲10的數字。

+0

爲什麼float f2 = 12345678f;字符串str = f2.ToString(「R」);工作呢? – pastillman 2014-12-04 20:23:00

+0

@pastillman在某些情況下,可以進行(智能)舍入。所以f2仍然是f2,但是它打印了一些四捨五入的東西。 – Emz 2014-12-04 20:24:38

+0

從我對往返的理解,ToString(「R」)不應該做任何舍入 – pastillman 2014-12-04 20:26:01