Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Double.ToString()如何显示比Double精度更多的字符?_C#_.net_Vb.net_Double_Floating Point Precision - Fatal编程技术网

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

C# Double.ToString()如何显示比Double精度更多的字符?,c#,.net,vb.net,double,floating-point-precision,C#,.net,Vb.net,Double,Floating Point Precision,Double.ToString如何显示更多的字符32这是精确的15-16 我希望MyObject.ToString只代表MyObject,而不是MyObject+来自计算机的垃圾 为什么 但是 为什么 但是 Double.ToString如何显示比Double更精确的字符32 15-16 它显示的不是32,而是17,前导零不算。浮点意味着它可以独立于值的变化跟踪大小的变化 我希望MyObject.ToString只代表MyObject 确实如此,由于浮点数的机制,可能会有轻微的差异,但真正的数字

Double.ToString如何显示更多的字符32这是精确的15-16

我希望MyObject.ToString只代表MyObject,而不是MyObject+来自计算机的垃圾

为什么

但是

为什么

但是

Double.ToString如何显示比Double更精确的字符32 15-16

它显示的不是32,而是17,前导零不算。浮点意味着它可以独立于值的变化跟踪大小的变化

我希望MyObject.ToString只代表MyObject

确实如此,由于浮点数的机制,可能会有轻微的差异,但真正的数字由字符串精确表示

不是我的对象+来自计算机的垃圾

没有垃圾,有浮点不准确。它也存在于十进制中,准确地记下1/3作为十进制数。你不能,它包含一个重复的小数位。双精度存储在基数2中,因此即使是0.1也会创建一个重复的小数

还请注意,由于调用了两种不同的显示方法,因此得到了两种不同的表示形式。ToString有特定的语义,而调试窗口可能有不同的语义。如果你想知道E的意思,也可以查一下科学记数法。

检查这个

请记住,浮点数只能近似于十进制数,而浮点数的精度决定了该数字近似于十进制数的精度。默认情况下,双精度值包含15位小数精度,但内部最多保留17位。浮点数的精度有几个后果:

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

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

如果涉及浮点数,则值可能不会往返。如果一个操作将原始浮点数转换为另一种形式,一个逆操作将转换后的形式转换回浮点数,并且最终浮点数等于原始浮点数,则该值称为往返。由于一个或多个最低有效位在转换过程中丢失或更改,往返可能失败


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

浮点表示法的精度是它与给定小数的近似程度。双精度是15-16位

浮点表示法的范围与该表示法可近似的数字大小有关。双精度的范围为+/-5.0e-324至+/-1.7e308

因此,在您的例子中,计算精确到16个字符,而在这之后,就不是预期的那样了


这看起来很简单,只是不能用标准的浮点表示法表示。如果您要求绝对无偏差,则应使用不同的数据类型,如decimal。

实际上,ToString结果的有效位数较少。它的字符数当然更少,大约是一半。你把精度和有效数字混淆了,你应该知道,像0.1这样的小数不能用二进制精确表示。你试过使用十进制数据类型吗?精度不是精度,如果你不想要垃圾,不要使用Double,或开始取整。@HenkHolterman我认为计算机中的垃圾表明他不知道浮点错误,而不是不知道科学符号。@Servy-但它不确定/清楚,我关闭的主要原因。为什么0.1不仅仅是0.1,而是0.10000000000000xyzrklsjdhf?我知道1/3是不准确的,因为存在偏差,但我无法理解为什么0.1不准确@双精度运算是二进制的,而不是十进制的。尝试用二进制写入0.1小数。你会得到0.000110011…为什么0.2-0.1总是精确地给出0.1??为什么1.0-0.1-0.9是精确的0.0,而不是1.0-0.9-0.1???@serhio 0.2-0.1没有给出精确的0.1,它只会在显示给你时产生一个四舍五入到0.1的数字,因为这是最接近的近似值。为什么1.0-0.1-0.9正好是0.0,而不是1.0-0.9-0.1?第一个值实际上并不准确,它只是碰巧舍入到正确的值。这两个表达式都会导致浮点错误。
?(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"
?0.1
0.1
?0.2-0.1
0.1
?0.1-0.1
0.0
?1.0-0.9-0.1
-0.000000000000000027755575615628914
?1.0-0.1-0.9
0.0
?1.0-0.9-0.1
-0.000000000000000027755575615628914