c#双类型格式化
本文关键字:格式化 类型 | 更新日期: 2023-09-27 18:18:08
我正在尝试将c#双精度值转换为指数符号字符串。考虑以下c#代码:
double d1 = 0.12345678901200021;
Console.WriteLine(d1.ToString("0.0####################E0"));
//outputs: 1.23456789012E-1 (expected: 1.2345678901200021E-1)
谁能告诉我从double d1输出"1.2345678901200021E-1"的格式字符串,如果可能的话?
双精度值只能保存15到16位数字,你有17位(如果我没算错的话)。因为64位双精度数只包含16位数字,所以最后一位数字会被截断,因此当您将该数字转换为科学记数法时,最后一位数字似乎被截断了。
您应该使用Decimal。十进制类型可以保存128位数据,而双精度类型只能保存64位数据。
根据double.ToString()
的文档,double
没有精度:
默认情况下,返回值只包含15位精度,但内部维护的最大精度为17位。如果此实例的值大于15位,ToString返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是期望的数字。如果您需要更高的精度,请使用"G17"格式规范指定format,它总是返回17位精度,或者"R",如果数字可以用该精度表示,则返回15位;如果数字只能用最大精度表示,则返回17位。
Console.WriteLine(d1)
应该告诉你double不支持你想要的精度。使用decimal
代替(64位vs 128位)。
我的即时窗口说,您可以期望从double
的最大分辨率数字是关于15位数。
我的VS2012即时窗口显示0.12345678901200021的分辨率实际上是16位有效数字:
0.1234567890120002
因此,我们期望在字符串中至少报告最后一个"2"位。
但是如果你使用"G17"格式字符串:
0.12345678901200021D.ToString("G17");
将得到一个16位精度的字符串。