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