从 What’s New In Python 3.7起
我们可以看到有新的
math.remainder
.它说
Return the IEEE 754-style remainder of x with respect to y. For finite x and finite nonzero y, this is the difference
x - n*y
, where n is the closest integer to the exact value of the quotientx / y
. Ifx / y
is exactly halfway between two consecutive integers, the nearest even integer is used forn
. The remainderr = remainder(x, y)
thus always satisfiesabs(r) <= 0.5 * abs(y)
.Special cases follow IEEE 754: in particular,
remainder(x, math.inf)
is x for any finite x, andremainder(x, 0)
andremainder(math.inf, x)
raiseValueError
for any non-NaN x. If the result of the remainder operation is zero, that zero will have the same sign as x.On platforms using IEEE 754 binary floating-point, the result of this operation is always exactly representable: no rounding error is introduced.
但我们也记得有%
符号
remainder of
x / y
我们还看到操作符有一条说明:
Not for complex numbers. Instead convert to floats using
abs()
if appropriate.
如果可能的话,我还没有尝试过运行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
所以不同的是,我们会在文档中得到ValueError,而不是nan和ZeroDivisionError.
那么问题是%和math.remainder之间有什么区别? math.remainder是否也适用于复数(%缺少它)?主要优势是什么?
这是官方CPython github repo的source of math.remainder
.
最佳答案
Return the IEEE 754-style remainder of x with respect to y. For finite
x and finite nonzero y, this is the differencex - n*y
, where n is the
closest integer to the exact value of the quotientx / y
. Ifx / y
is
exactly halfway between two consecutive integers, the nearest even
integer is used for n. The remainderr = remainder(x, y)
thus always
satisfiesabs(r) <= 0.5 * abs(y)
.
对于模数,这是m = x-n * y,其中n是floor(x / y),所以0 <= m
modulo(2.7, 1) = 0.7
remainder(2.7, 1) = -0.3