Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.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
Python 楼层划分操作员的结果不一致_Python_Python 3.x - Fatal编程技术网

Python 楼层划分操作员的结果不一致

Python 楼层划分操作员的结果不一致,python,python-3.x,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。您可以通过使用字符串格

今天我注意到地板划分有点奇怪:

>>> 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。

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

>>> format(10.1, '.70f')
'10.0999999999999996447286321199499070644378662109375000000000000000000000'
>>> format(1.01, '.70f')
'1.0100000000000000088817841970012523233890533447265625000000000000000000'
这一点突然变得非常清楚:最接近10.1的二进制数在量级上比精确数略小,而最接近1.01的二进制数则比精确数略大

但是,
10.1/1.01
的实际结果被精确舍入到10.0,因为该值与除法结果最接近:

>>> 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
但是地板划分首先向下舍入,然后向下舍入到整数

更具体地说,在CPython调用中,它反过来使用查找除法的浮点余数。C标准库中
fmod
的描述如下

说明

  • fmod
    函数计算
    x/y
    的浮点余数
  • 返回

  • fmod
    函数返回某个整数
    n
    的值
    x-ny
    ,这样,如果
    y
    为非零,则结果与
    x
    具有相同的符号,且幅值小于
    y
    的幅值。如果
    y
    为零,则域错误是否发生或
    fmod
    函数是否返回零由实现定义
  • fmod
    功能与CPython标准库一样可用


    math.fmod(10.1,1.01)
    的结果是

    >>> format(math.fmod(10.1, 1.01), '.70f')
    '1.0099999999999995647925743469386361539363861083984375000000000000000000'
    

    如果我们从
    10.1
    中减去它,并将结果四舍五入到最接近的精确整数,我们得到
    9

    相当于
    '.70f''%10.1
    '{.70f}'。格式(10.1)
    ,或
    f'{10.1:.70f}