楼层划分操作员的结果存在差异

时间:2019-03-26 20:58:15

标签: python python-3.x

我发现今天的楼层划分有些奇怪:

>>> 10.1/1.01
10.0
>>> 10.1//1.01
9.0

>>> 2688937/268893.7
10.0
>>> 2688937//268893.7
9.0

>>> 6.6/3.3
2.0
>>> 6.6//3.3
2.0

我认为这是由于浮点错误引起的,但我想知道是否还有其他原因可能会使10.0降至9.0。

1 个答案:

答案 0 :(得分:6)

您可以使用format函数的字符串格式检查浮点数的精确十进制扩展:

>>> format(10.1, '.70f')
'10.0999999999999996447286321199499070644378662109375000000000000000000000'
>>> format(1.01, '.70f')
'1.0100000000000000088817841970012523233890533447265625000000000000000000'

突然很清楚:最接近10.1的二进制significand的大小比精确数字小 ,而最接近1.01的二进制float.__floordiv__稍微大了 / em>。

但是,10.1 / 1.01的实际结果四舍五入为10.0 exact ,因为那个是最接近除法结果的值

>>> format(10.1 / 1.01, '.f')
'10.0000000000000000000000000000000000000000000000000000000000000000000000'

但地板部门首先向下四舍五入,然后将地板向下四舍五入为整数。

更具体地说,CPython中的float_divmod调用fmod C standard library function,而后者又使用math.fmod查找除法的浮点余数。 C标准库中的fmod的描述是

  

说明

     
      
  1. fmod函数计算x/y的浮点余数。
  2.   
     

返回

     
      
  1. 对于某些整数fmodx - ny函数返回值n,使得如果y为非零,则结果与{{1}相同},其幅度小于x的幅度。如果y为零,则实现定义是发生域错误还是y函数返回零。
  2.   

fmod函数在CPython标准库中以https://github.com/G33kDude/Chrome.ahk的形式提供。


fmod的结果是

math.fmod(10.1, 1.01)

,如果我们从>>> format(math.fmod(10.1, 1.01), '.70f') '1.0099999999999995647925743469386361539363861083984375000000000000000000' 中减去该值并将结果四舍五入为最接近的精确整数,则得到10.1