来自What’s New In Python 3.7
我们可以看到有新的math.remainder
。它说
返回相对于y的IEEE 754样式的x余数。对于有限x和有限非零y,这是差
x - n*y
,其中n是与商x / y
的精确值最接近的整数。如果x / y
恰好位于两个连续整数之间,则最近的偶数整数用于n
。其余r = remainder(x, y)
因此始终满足abs(r) <= 0.5 * abs(y)
。特殊情况遵循IEEE 754:特别是
remainder(x, math.inf)
对于任何有限x都是x,而remainder(x, 0)
和remainder(math.inf, x)
对于任何非NaN x都是ValueError
。如果余数运算的结果为零,则该零将与x具有相同的符号。在使用IEEE 754二进制浮点的平台上,此操作的结果始终完全可以表示:不会引入舍入错误。
但我们也记得有%
符号
剩余的
x / y
我们也看到操作员有一个注释:
不是复杂的数字。而是在适当的情况下使用
abs()
转换为浮点数。
如果可能的话,我还没有尝试过运行Python 3.7。
但我试过
Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> 100 % math.inf
100.0
>>> math.inf % 100
nan
>>> 100 % 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
差别很大,而不是nan
和ZeroDivisionError
,我们会像文档中所说的那样得到ValueError
。
所以问题是%
和math.remainder
之间有什么区别? math.remainder
是否也适用于复数(%
缺少)?主要优势是什么?
这是官方CPython github repo的source of math.remainder
。