为什么Convert.ToString格式会以这种方式加倍?

时间:2013-08-21 12:25:27

标签: c#

请考虑以下代码:

var rateUsed = 0.00000001;
var rateUsedConvertToString = Convert.ToString(rateUsed);
var rateUsedToString = rateUsed.ToString();

而不是我的字符串是“0.00000001”,它们都是“1E-08”。我无法控制rateUsed的初始类型,它是一个double,我想要double的精确字符串表示。

为什么会发生这种情况,如果以双重值开始,我如何将0.00000001作为字符串?

3 个答案:

答案 0 :(得分:6)

如果您需要特定格式,则需要通过参数告诉它您想要的内容。可用standard formats are here,或者您可以使用custom formats。将您选择的格式传递给ToString(format)Convert.ToString(value, format)

请注意; 1E-8正好是0.00000001 - 这只是使用指数表示法,即这是1×10 -8

默认格式为“general”,描述为:

  

结果:定点或科学记数法中最紧凑的

所以是的,有时它会使用科学(又称指数)符号 - 具体来说,只要它比定点符号短,它就会这样做。也许尝试使用.ToString("F")

答案 1 :(得分:2)

您可能希望开始关注When does Double.ToString() return a value in scientific notation?

据说,正如@MarcGravell所推断,1E-08 = 0.00000001,它只是以科学记数法显示。如果您正在寻找输出为十进制数字(典型值)的内容,您可能希望以不同方式对其进行格式化。如:

var rateUsed = 0.00000001;
var rateUsedToStringFormatted = rateUsed.ToString("0.########"); // 0.00000001

另一种选择是创建自定义IFormatProvider / ICustomFormatter,以便始终如一地执行此转换。然后,不是在任何地方使用.ToString("0.########"),而是可以提供.ToString(MyDoubleFormatter)以获得更一致的输出(并且,如果您在以后更改它,则在一个位置进行更改)。

答案 2 :(得分:2)

您可能希望fixed-point ("F") format specifier使用different overload of ToString,其中一个接受格式说明符字符串:

int num = 175;
Console.WriteLine(num.ToString("F", CultureInfo.InvariantCulture));  // 175.00
Console.WriteLine(num.ToString("F3", CultureInfo.InvariantCulture)); // 175.000 

或者,您可以使用custom format specifier

Console.WriteLine(num.ToString("00000.00", CultureInfo.InvariantCulture)); // 00175.00

此外,如这些示例所示,每当您将值转换为文本表示时,请考虑将CultureInfo.InvariantCulture用于独立于当前线程文化存储的数据(例如,将数据写入文件时,例子)。