0.1是一个近似值,但是当我们加上0.1和0.2时,为什么不把幕后也聚集起来呢?

0.1 is an approximation, but why not round up behind the scenes as well when we add 0.1 and 0.2?


0.1是一个近似值,但是当我们加上0.1和0.2时,为什么不把幕后也聚集起来呢? 已获得1个解决方法 2020-08-19 06:48:50 floating-point

我得到 0.1 实际上是 0.0001100110011001100110011001100110011001100110011... .

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

为什么不保持幻觉,给用户蓝色药丸,告诉他0.1 0.2是0.3?无知是幸福,不是吗?


0.1是一个近似值,但是当我们加上0.1和0.2时,为什么不把幕后也聚集起来呢? 方法1

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

.000110011001100110011001100110011001100110011001100110102,

最接近.2的是:

.001100110011001100110011001100110011001100110011001101002.

这些的实数和是:

.010011001100110011001100110011001100110011001100110011102.

这个数字有54个有效数字.(显示56位数字,用于与以前的数字对齐和比较.前导0只是为了对齐,尾随0对值没有意义,所以从第一个1到最后一个1有54位.) binary64格式只有53位有效位 (表示的分数部分).所以这个数字不能用binary64格式表示.

它正好在两个可表示的数字之间:

.010011001100110011001100110011001100110011001100110011002 and
.010011001100110011001100110011001100110011001100110100002.

当有平局时,打破平局的常见规则是在低位使用偶数数字.由于第一个在适合有效位的位中以0111结束,第二个以1000结束,因此选择第二个,这是使用浮点加法将这两个数字相加的结果.

该值为0.3000000000000000444089209850062616169452667236328125.

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

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

另一种常见的格式化方法是使用固定数量的十进制数字 (例如17) 将数字转换为十进制,然后删除尾随零.在这种情况下,将具有相同的结果,“.3” 表示0.299999999999999988897769753748434595763683319091796875,“0.30000000000000004” 表示0.3000000000000000444089209850062616169452667236328125.

此外,向程序员隐藏信息不是一个好主意.这样做允许错误的想法增长和错误发生.当价值不完全是天真的解释所认为的那样时,最好显示差异而不是隐藏它们.


.htaccess .net .net-core 2d 3d 3d-printing actions-on-google actionscript-3 activemq acumatica adobe-xd aframe ag-grid air airflow ajax akka alexa algorithm alignment allure amadeus amazon-cognito amazon-deequ amazon-dynamodb amazon-ec2 amazon-redshift amazon-s3 amazon-sqs amazon-web-services