Double.ToString()如何显示Double的精度更多的字符?

时间:2012-10-19 17:05:03

标签: c# .net vb.net double floating-point-precision

?(1.0-0.9-0.1)
-0.000000000000000027755575615628914

?((double)1.0-(double)0.9-(double)0.1)
-0.000000000000000027755575615628914

?((double)1.0-(double)0.9-(double)0.1).GetType()
{Name = "Double" FullName = "System.Double"}

?((double)1.0-(double)0.9-(double)0.1).ToString()
"-2,77555756156289E-17"

Double.ToString()如何显示double精度(15-16)的更多字符(32)?

我希望MyObject.ToString()代表只是 MyObject 而不是MyObject+SomeTrashFromComputer

为什么

?0.1
0.1
?0.2-0.1
0.1
?0.1-0.1
0.0

BUT

?1.0-0.9-0.1
-0.000000000000000027755575615628914

WHY

?1.0-0.1-0.9
0.0

BUT

?1.0-0.9-0.1
-0.000000000000000027755575615628914

3 个答案:

答案 0 :(得分:3)

  

Double.ToString()如何显示双倍精度(15-16)的更多字符(32)?

它不显示32,显示17,前导零不计。 浮动点意味着它可以跟踪值的变化而不同于值的变化。

  

我希望MyObject.ToString()只代表MyObject

确实如此,由于浮点数的机制可能会略有不同,但真正的数字由字符串精确表示。

  

不是MyObject + SomeTrashFromComputer

没有垃圾,浮点不准确。它也以十进制形式存在,准确地将1/3写为十进制数。你不能,它涉及重复的小数位。 Double存储在base 2中,因此即使0.1也会创建一个重复的“decimal”。

另请注意,您将获得两种不同的表示形式,因为您正在调用两种不同的显示方法。 ToString具有特定的语义,而您的调试窗口可能有不同的语义。如果你想知道E的意思,还要查找科学记数法。

答案 1 :(得分:2)

选中此System.Double

  

请记住,浮点数只能近似一个十进制数,并且浮点数的精度决定了该数字接近十进制数的准确程度。默认情况下,Double值包含15个十进制数字的精度,但内部最多保留17位数。浮点数的精度有几个结果:

     

对于特定精度看起来相等的两个浮点数可能无法比较相等,因为它们的最低有效位数不同。

     

如果使用十进制数,使用浮点数的数学运算或比较运算可能不会产生相同的结果,因为浮点数可能不完全接近十进制数。

     

如果涉及浮点数,则值可能不会进行往返。如果操作将原始浮点数转换为另一种形式,则称一个值为往返,反向操作将转换后的形式转换回浮点数,并且最终浮点数等于原始浮点数数。往返可能会失败,因为转换中丢失或更改了一个或多个最低有效数字。

答案 2 :(得分:1)

我认为你不清楚浮点数的两个方面; 精度范围

浮点表示的精度是它接近给定小数的接近程度。 double的精度为15-16位。

浮点表示的范围与该表示可以近似的数字大小有关。 double的范围是+/- 5.0e-324到+/- 1.7e308。

因此,在您的情况下,计算精确到16个字符,之后不是,正如预期的那样。

看似简单的

Some numbers在标准浮点表示中无法表示。如果您完全没有偏差,则应使用其他数据类型,例如decimal