Python中的Modulo运算符

时间:2012-10-05 22:07:44

标签: python python-3.x operators

以下代码中的模数是什么?

from math import *
3.14 % 2 * pi

我们如何计算浮点数的模数?

5 个答案:

答案 0 :(得分:62)

当你有表达式时:

a % b = c

这实际上意味着存在一个整数n,使c尽可能小,但非负。

a - n*b = c

手动,您可以反复减去2(或者如果您的数字为负数,则添加2),直到最终结果为可能的最小正数:

  3.14 % 2
= 3.14 - 1 * 2
= 1.14

此外,3.14 % 2 * pi被解释为(3.14 % 2) * pi。我不确定你是否打算写3.14 % (2 * pi)(在任何一种情况下,算法都是相同的。只需减去/添加,直到数字尽可能小)。

答案 1 :(得分:24)

除了其他答案之外,fmod documentation还有一些有趣的话题可以说:

  

math.fmod(x, y)

     

返回fmod(x, y),由平台C定义   图书馆。请注意,Python表达式x % y可能不会返回相同的内容   结果。 C标准的目的是fmod(x, y)完全正确   (数学上;无限精度)等于某些x - n*y   整数n使得结果与x和幅度具有相同的符号   小于abs(y)。 Python的x % y返回符号为y的结果   相反,并且可能不完全可以计算浮点参数。对于   例如,fmod(-1e-100, 1e100)-1e-100,但是Python的结果   -1e-100 % 1e1001e100-1e-100,无法完全表示为浮点数,并且会转向令人惊讶的1e100。为此原因,   函数fmod()通常在使用浮点数时是首选,而   使用整数时,首选Python x % y

答案 2 :(得分:2)

与普通模3.14 % 6.28 = 3.14相同,就像3.14%4 =3.14 3.14%2 = 1.14(其余的......)

答案 3 :(得分:2)

你期望从正常的模数中得到同样的东西......例如7 % 4 = 37.3 % 4.0 = 3.3

注意浮点精度问题。

答案 4 :(得分:1)

你应该使用fmod(a,b)

While abs(x%y) < abs(y) is true数学上,对于floats,由于roundoff,它可能不是数字真实的。

例如,假设Python floatIEEE 754双精度数字的平台,-1e-100 % 1e1001e100具有相同的符号,计算结果为-1e-100 + 1e100,在数值上完全等于1e100

math模块中的函数fmod()返回一个符号与第一个参数的符号匹配的结果,因此在这种情况下返回-1e-100。哪种方法更合适取决于应用程序。

where x = a%b用于整数模