-9
?(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"

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

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

为什么

?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
4

3 回答 3

3

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

它不是显示 32,而是显示 17,前导零不算数。浮点意味着它可以将大小的变化与值的变化分开跟踪。

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

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

不是 MyObject+SomeTrashFromComputer

没有垃圾,有浮点不准确。它也以十进制形式存在,准确记1/3为十进制数。你不能,它涉及重复的小数位。双精度数以 2 为基数存储,因此甚至0.1会创建一个重复的“十进制”。

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

于 2012-10-19T17:23:59.297 回答
2

检查这个System.Double

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

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

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

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

于 2012-10-19T17:24:02.370 回答
1

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

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

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

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

一些看似简单的数字在标准浮点表示中是无法表示的。如果您要求绝对没有偏差,您应该使用不同的数据类型,例如decimal.

于 2012-10-19T17:30:50.963 回答