Python 对math.pow()使用模运算的意外结果

Python 对math.pow()使用模运算的意外结果,python,Python,我得到了错误的答案: long(math.factorial(100)) % long(math.pow(12, 48)) 答案应该是0,但Python给出: 3533293188234793495632656292699172292923858530336768L 为什么会发生这种情况 我如何正确计算 您正在对不成立的浮点转换进行假设。浮点数是一种近似值,使用二进制分数,精度有限 您在这里创建了一个非常大的数字: >>> math.pow(12, 48) 6.31974

我得到了错误的答案:

long(math.factorial(100)) % long(math.pow(12, 48))
答案应该是0,但Python给出:

3533293188234793495632656292699172292923858530336768L
  • 为什么会发生这种情况
  • 我如何正确计算

您正在对不成立的浮点转换进行假设。浮点数是一种近似值,使用二进制分数,精度有限

您在这里创建了一个非常大的数字:

>>> math.pow(12, 48)
6.319748715279271e+51
这是一个52位的数字,但浮点数不能精确模拟所有这些数字。将该数字转换为整数将导致不精确的结果:

>>> long(math.pow(12, 48)) - (12 ** 48)
351985927636009487190448992086392832L
这是36位数的不精确

答案是不要使用
math.pow()
;对整数使用
**
指数运算符:

>>> math.factorial(100) % (12 ** 48)
0L

您能否澄清为什么预期结果为0?为什么将标记从更改回?这个问题只适用于Python2.x。Python3没有
long
的概念;当溢出
size\u t
时,所有数字都会隐式转换为Long。Python3中没有
long
内置或关键字,而
20L
在Python3中不是数字文字。这个问题对于Python2来说再具体不过了。@Arturpadaliancyk阶乘100将有48个12。基本上,你必须计算3的总数,因为这将限制12的数量(12=3*4,将有足够的4)。进行计数时,所有3的倍数将有一个3,所有9的倍数将有两个3,所有27的倍数将有三个3,所有81的倍数将有一个3。我们得到的计数是33+11+3+1=48。(100有33个3、11个9、3个27和1个81)@tac,因为即使删除“long”并在python3中隐式转换,同样的“问题”仍然存在。Martjin给出的答案与Python 2和3相关。@Arturpadaliancyk,因为它是。。。?这是个奇怪的问题。