2

考虑以下代码:

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

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

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

4

3 回答 3

6

如果你想要一个特定的格式,那么你需要通过参数告诉它你想要什么。可用的标准格式在这里,或者您可以使用自定义格式。将您选择的格式传递给ToString(format)Convert.ToString(value, format)

笔记; 1E-8 正好是 0.00000001 - 这只是使用指数符号,即这是 1×10 -8

默认格式为“通用”,描述为:

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

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

于 2013-08-21T12:31:05.990 回答
2

您可能想开始查看Double.ToString() 何时以科学计数法返回值?

话虽如此,正如@MarcGravell 推断的那样,1E-08= 0.00000001,它只是以科学记数法显示。如果您正在寻找以十进制数(典型)形式输出的内容,您可能需要考虑以不同的方式对其进行格式化。如:

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

另一种选择是创建一个自定义IFormatProvider/ICustomFormatter它将一致地执行此转换。然后,.ToString("0.########")您可以提供更一致的输出,而不是到处使用.ToString(MyDoubleFormatter)(并且,如果您以后更改它,您将在一个位置这样做)。

于 2013-08-21T12:32:53.023 回答
2

您可能希望使用具有不同重载的定点(“F”)格式说明符,它接受格式说明符字符串:ToString

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

或者,您可以使用自定义格式说明符

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

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

于 2013-08-21T12:33:59.900 回答