>>> 8.0 / 0.4 # as expected
20.0
>>> floor(8.0 / 0.4) # int works too
20
>>> 8.0 // 0.4 # expecting 20.0
19.0
这在Python 2和3的x64上都发生。
就我所看到的,这要么是一个bug,要么是一个非常愚蠢的规范,因为我没有看到任何理由,最后的表达式应该评估为19.0。
为什么不把a // b简单地定义为floor(a / b)?
编辑:8.0 % 0.4也评估为0.3999999999999996。至少这是一致的,因为然后8.0 // 0.4 * 0.4 + 8.0 % 0.4评估为8.0
编辑:这不是Is floating point math broken?的重复,因为我想知道为什么这个特定的操作会受到(可能可避免的)舍入误差的影响,以及为什么a // b没有被定义为等于floor(a / b)。
备注:我猜这不起作用的更深层次原因是地板除法是不连续的,因此具有无限的条件数,使其成为一个病态问题。地板除法和浮点数根本不兼容,你永远不应该在浮点数上使用//
。只需使用整数或分数即可。
'%.20f'%0.4
的结果为'0.40000000000000002220'
,所以0.4
显然略微大于0.4
。 - khelwoodfloor(8.0/0.4)
如何产生正确的结果? - Aswin Murugeshfloat
类型的浮点数通常是错误的。其次,对于负数和float
数字,//
和%
是相当不可靠的(意思是,会出现意外行为)。Decimal 对象的文档简要讨论了负整数的//
以及Decimal
库如何以不同的方式处理它。 - TigerhawkT3floor(8.0/0.4)
和"floor-division"的8.0//0.4
会做出两种不同的处理。 - jotasi