我发现今天的楼层划分有些奇怪:
>>> 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。
答案 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
的描述是
说明
fmod
函数计算x/y
的浮点余数。返回
- 对于某些整数
fmod
,x - ny
函数返回值n
,使得如果y
为非零,则结果与{{1}相同},其幅度小于x
的幅度。如果y
为零,则实现定义是发生域错误还是y
函数返回零。
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
。