Convert.ToSingle(string)C#转换歧义

时间:2016-03-11 15:44:07

标签: c# .net

我有这段代码:

string x = "-0.228469369833477";

Single s = Convert.ToSingle(x);

Console.WriteLine(s);

控制台输出:-2,284694E + 14。

我该怎么做才能输出:-0.228469369833477?

4 个答案:

答案 0 :(得分:3)

以原始形式输出数字:

var s = -0.228469369833477;
Console.WriteLine(s.ToString("0.#######################"));

请注意,s可能是double,而不是single。使用single您很可能会丢失数字。要获得足够的精度来表示所有数字,请改用Convert.ToDouble()

要确保在您的语言区域中正确解析该号码,请使用CultureInfo.InvariantCulture,正如其他答案所述。

decimal将为您提供28-29个有效数字的精确度,精度更高且没有科学记数法问题。

进一步阅读
Custom Numeric Format Strings

答案 1 :(得分:1)

Single s = Single.Parse(x, CultureInfo.InvariantCulture);

如果您希望输出该确切数字,则不能使用float,因为它无法提供您想要的精度。尝试使用双倍。

double s = Double.Parse(x, CultureInfo.InvariantCulture);

答案 2 :(得分:1)

嗯,当前文化中'.'被视为分隔符(','十进制一个<) em>(例如俄罗斯文化 - "RU-ru"就是这样)并且由于分隔符在转换时被忽略,您有-228469369833477(或-2,284694E+14)。

string x = "-0.228469369833477";

// To ensure that '.' is treated as decimal separator
// lets put culture explicitly - CultureInfo.InvariantCulture 
Single s = Convert.ToSingle(x, CultureInfo.InvariantCulture);

Console.WriteLine(s);

但是,您有太多的数字代表Single,而您只能返回-0.2284694(不是-0.228469369833477)。如果您想要完全对应,则必须使用Double而不是Single

Double s = Convert.ToDouble(x, CultureInfo.InvariantCulture);

// -0.228469369833477
Console.WriteLine(s, CultureInfo.InvariantCulture);

答案 3 :(得分:0)

您可以使用

Console.WriteLine(string.Format("{0:N8}", s));

输出单个到8位小数。

您还可以在进行字符串格式化时指定文化:

Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0:N8}", s));

这是一个工作小提琴:https://dotnetfiddle.net/nS9qXh