我有这段代码:
string x = "-0.228469369833477";
Single s = Convert.ToSingle(x);
Console.WriteLine(s);
控制台输出:-2,284694E + 14。
我该怎么做才能输出:-0.228469369833477?
答案 0 :(得分:3)
以原始形式输出数字:
var s = -0.228469369833477;
Console.WriteLine(s.ToString("0.#######################"));
请注意,s
可能是double
,而不是single
。使用single
您很可能会丢失数字。要获得足够的精度来表示所有数字,请改用Convert.ToDouble()
。
要确保在您的语言区域中正确解析该号码,请使用CultureInfo.InvariantCulture
,正如其他答案所述。
decimal
将为您提供28-29个有效数字的精确度,精度更高且没有科学记数法问题。
答案 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