浮动到字符串使用往返
我想将一个浮点数转换为它的字符串表示形式,而不会出现在科学记数法中的结果。浮动到字符串使用往返
我第一次尝试:
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
不是零,它代表着“数字如果非零和零,如果零”,而“#”代表“数字如果不为零或什么,如果零”。
您可以使用格式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
试试这个:
largeNumber.ToString("r")
您可以在这里找到可用的格式列表: http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
的问题是,float
只支持精度7位。无法在浮点数中精确地表示12345678f
,因此它将转换为最接近的可表示浮点值,即12345680f
。这不是数字的大小,而是关键问题的精度位数。
另外,0.0005
不能用表示,用二进制浮点数表示;最接近的8位二进制浮点数到0.0005
是0.0004999999966
decimal
支持更高的精确度,并能精确地使用标准N
格式说明表示底数为10的数字。
为什么float f2 = 12345678f;字符串str = f2.ToString(“R”);工作呢? – pastillman 2014-12-04 20:23:00
@pastillman在某些情况下,可以进行(智能)舍入。所以f2仍然是f2,但是它打印了一些四舍五入的东西。 – Emz 2014-12-04 20:24:38
从我对往返的理解,ToString(“R”)不应该做任何舍入 – pastillman 2014-12-04 20:26:01
我已经提到过这个 – pastillman 2014-12-04 20:20:26