2014-12-04 34 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