Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
Floating point 0.1是一个近似值,但是当我们添加0.1和0.2时,为什么不在幕后进行取整呢?_Floating Point_Usability - Fatal编程技术网

Floating point 0.1是一个近似值,但是当我们添加0.1和0.2时,为什么不在幕后进行取整呢?

Floating point 0.1是一个近似值,但是当我们添加0.1和0.2时,为什么不在幕后进行取整呢?,floating-point,usability,Floating Point,Usability,我知道0.1实际上是0.000110011… 但是,例如在Python中,当我们添加0.1和0.2时,为什么要将0.300000000004输出到提示符 为什么不保持这种错觉,给使用者蓝色药丸,告诉他0.1+0.2等于0.3?无知是福,不是吗?Python规范对浮点行为并不严格,但许多实现使用IEEE-754二进制64格式。在此格式中可表示的数字中,最接近.1的是: .000110011001100110011001100110011001100110011001100110102, .0001

我知道
0.1
实际上是
0.000110011…

但是,例如在Python中,当我们添加0.1和0.2时,为什么要将
0.300000000004
输出到提示符


为什么不保持这种错觉,给使用者蓝色药丸,告诉他0.1+0.2等于0.3?无知是福,不是吗?

Python规范对浮点行为并不严格,但许多实现使用IEEE-754二进制64格式。在此格式中可表示的数字中,最接近.1的是:

.000110011001100110011001100110011001100110011001100110102, .000110011001100110011001100110011001100110011001100110102, 与.2最接近的是:

.001100110011001100110011001100110011001100110011001101002. .001100110011001100110011001100110011001100110011001101002. 其中的实数和为:

.010011001100110011001100110011001100110011001100110011102. .010011001100110011001100110011001100110011001100110011102. 这个数字有54个有效数字。(显示56位数字,用于对齐和与以前的数字进行比较。前导0仅用于对齐,尾随0对值没有意义,因此从前1到后1有54位数字。)binary64格式的有效位(表示的分数部分)只有53位。所以这个数字不能用binary64格式表示

它正好位于两个可表示数字的中间:

.010011001100110011001100110011001100110011001100110011002 and .010011001100110011001100110011001100110011001100110100002. .01001100111002和 .010011001100110011001100110011001100110011001100110100002. 当出现平局时,打破平局的一般规则是使用偶数位数处于低位的数字。由于第一个以有效位中的0111结尾,第二个以1000结尾,因此选择第二个,这是使用浮点加法将这两个数字相加的结果

该值为0.3000000000044408920988500626169452667236328125

请记住,进行加法的计算机或软件部分不知道这些数字最初来自.1或.2。它只有上面显示的位可以使用。它得到一个介于两个可表示值之间的和,并且必须选择一个作为结果。该选择的规则是使用具有偶数低位的值

一旦获得结果,就可以选择如何格式化它。同样,Python规范并不严格,但一种格式化行为是显示刚好足够的数字,以便将数字与相邻的可表示值唯一区分开来。最接近.3的可表示数字为0.29999999999988897769753748434595763683319091796875,因此,在显示该数字时,将显示“.3”。当显示0.3000000000044408909098500626169452667236328125时,我们不能使用“.3”,因为它无法将其与0.299999999999988897769753748434595767683319091796875区分开来。因此,为了区分它,它必须显示为“0.300000000004”

另一种常见的格式化方法是使用固定数量的十进制数字(如17)将数字转换为十进制,然后删除尾随的零。在本例中,结果相同,0.299999999999998889776975374345957683319091796875的结果为“.3”,0.3000000000000000044408929500626169452667236328125的结果为“0.300000000000000004”


此外,对程序员隐藏信息不是一个好主意。这样做会让错误的想法滋生,让错误发生。当值不是一个天真的解释可能认为的值时,最好显示差异而不是隐藏它们。

Python规范对浮点行为并不严格,但许多实现使用IEEE-754 binary64格式。在此格式中可表示的数字中,最接近.1的是:

.000110011001100110011001100110011001100110011001100110102, .000110011001100110011001100110011001100110011001100110102, 与.2最接近的是:

.001100110011001100110011001100110011001100110011001101002. .001100110011001100110011001100110011001100110011001101002. 其中的实数和为:

.010011001100110011001100110011001100110011001100110011102. .010011001100110011001100110011001100110011001100110011102. 这个数字有54个有效数字。(显示56位数字,用于对齐和与以前的数字进行比较。前导0仅用于对齐,尾随0对值没有意义,因此从前1到后1有54位数字。)binary64格式的有效位(表示的分数部分)只有53位。所以这个数字不能用binary64格式表示

它正好位于两个可表示数字的中间:

.010011001100110011001100110011001100110011001100110011002 and .010011001100110011001100110011001100110011001100110100002. .01001100111002和 .010011001100110011001100110011001100110011001100110100002. 当出现平局时,打破平局的一般规则是使用偶数位数处于低位的数字。由于第一个以有效位中的0111结尾,第二个以1000结尾,因此选择第二个,这是使用浮点加法将这两个数字相加的结果

该值为0.3000000000044408920988500626169452667236328125

请记住,进行加法的计算机或软件部分不知道这些数字最初来自.1或.2。它只有上面显示的位可以使用。它得到一个介于两个可表示值之间的和,并且必须选择一个作为结果。该选择的规则是使用具有偶数低位的值

一旦获得结果,就可以选择如何格式化它。同样,Python规范并不严格,但一种格式化行为是显示刚好足够的数字,以便将数字与相邻的可表示值唯一区分开来。最接近.3的可表示数字为0.29999999999988897769753748434595763683319091796875,因此,在显示该数字时,将显示“.3”。当显示0.300000000004440892909850062616169452667236328125时,我们可以