JavaScript与Python模运算结果不一致的原因是什么
JavaScript与Python模运算结果差异原因
两种语言得到不同结果的核心原因是模运算的商取整规则不同,这是语言设计时的规范差异,和底层运算逻辑直接相关。
模运算的通用基础公式为:对整数a、b,存在整数商q和余数r,满足 a = q * b + r,其中0 ≤ |r| < |b|。两种语言的差异就来自q的取整规则:
- JavaScript采用向0取整的规则:计算
a/b得到的浮点数,会舍弃小数部分向0的方向取整得到q
计算-9 % 19时,-9/19 ≈ -0.47,向0取整得到q=0,代入公式得r = -9 - 0*19 = -9,和JS运算结果一致,此时余数符号和被除数保持一致。 - Python采用向负无穷取整的规则:计算
a/b得到的浮点数,会向更小的整数方向取整得到q
计算-9 % 19时,-9/19 ≈ -0.47,向负无穷取整得到q=-1,代入公式得r = -9 - (-1)*19 = 10,和Python运算结果一致,此时余数符号和除数保持一致。
而有限域GF(p)要求所有运算结果都落在[0, p-1]的区间内,10刚好在0~18的有效范围内,-9不在该区间,所以Python的结果符合有限域规则。
不同语言的模运算规则没有绝对的对错,只是设计取舍不同:C、Java等语言也采用和JS一致的向0取整规则,Ruby、Haskell等语言则采用和Python一致的向负无穷取整规则。
内容的提问来源于stack exchange,提问作者Mubarak Basha
相关产品推荐
相关产品推荐

