Python中的舍入/舍入条件

伊恩·哈克(IanHacker)

我正在将MATLAB代码移植到Python 3.5.1,但发现了浮点取整问题。

在MATLAB中,下面的数字将被四舍五入最多到第6位小数:

fprintf(1,'%f', -67.6640625);
-67.664063

在Python,而另一方面,下面的数字将被四舍五入至第6位小数:

print('%f' % -67.6640625)
-67.664062

有趣的是,如果该号码是“-67.6000625”,则取整起来,即使在Python:

print('%f' % -67.6000625)
-67.600063

...为什么会发生这种情况?在Python中四舍五入/四舍五入的条件是什么?(我认为这与处理十六进制值有关。)

更重要的是,如何防止这种差异?我应该创建一个Python代码,该代码可以重现与MATLAB产生的输出完全相同的输出。

这黑猫

python行为的原因与浮点数如何存储在计算机中以及IEEE定义的标准化舍入规则有关,IEEE定义了几乎所有现代计算机上使用的标准数字格式和数学运算。

由于需要在计算机上以二进制有效地存储数字,导致计算机使用浮点数。这些数字易于处理器使用,但是具有无法精确表示许多十进制数字的缺点这导致数字有时与我们认为应该的数字有些出入。

如果我们使用Python扩展值而不是将其截断,情况就会变得更加清晰:

>>> print('%.20f' % -67.6640625)
-67.66406250000000000000
>>>  print('%.20f' % -67.6000625)
-67.60006250000000704858

正如您所看到的,-67.6640625是一个可以精确表示的数字,但-67.6000625实际上不是更大。IEEE标准标准为浮点数定义的默认舍入模式表示,上面的任何内容5都应四舍五入,下面的任何内容都应四舍五入。因此,对于的情况-67.6000625,实际上是5加上少量,因此将其四舍五入。但是,对于-67.6640625,它等于5,因此抢七规则开始起作用。默认的决胜规则是四舍五入到最接近的偶数。由于2是最近的事件编号,因此将其舍入为两位。

因此,Python遵循浮点标准推荐的方法。那么问题来了,为什么您的MATLAB版本这样做呢?我在使用64位MATLAB R2016a的计算机上进行了尝试,并且得到了与Python相同的结果:

>> fprintf(1,'%f', -67.6640625)
-67.664062>>

因此,似乎MATLAB在某些时候使用了不同的舍入方法(也许是非标准方法,也许是标准中指定的替代方法之一),并且此后切换为遵​​循与其他所有人相同的规则。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章