上次学 python 的时候发现负数的取模运算结果和 PHP 的不一样,于是今天就试了一下,对比下各编程语言的差异。代码如下(这里只给出 PHP 代码,完整的其它语言的代码请点这里):
#! /usr/bin/env php <?php printf("%d %d %d %d\n", 9 % 4, -9 % 4, 9 % -4, -9 % -4); printf("%d %d %d %d\n", 8 % 4, -8 % 4, 8 % -4, -8 % -4);
上面的代码很简单,第一行是不能除尽的情况,第二行是可以除尽的情况。各种语言的输出结果如下:
c ----------------------------- 1, -1, 1, -1 0, 0, 0, 0 java -------------------------- 1 -1 1 -1 0 0 0 0 js ---------------------------- 1 -1 1 -1 0 0 0 0 php --------------------------- 1 -1 1 -1 0 0 0 0 lua --------------------------- 1 3 -3 -1 0 0 0 0 perl -------------------------- 1 3 -3 -1 0 0 0 0 python ------------------------ 1 3 -3 -1 0 0 0 0 rb ---------------------------- 1 3 -3 -1 0 0 0 0 sh ---------------------------- 1 -1 -1 1 0 0 0 0
根据输出我们可以得到下面两个结论:
- 能被整除的情况下,各语言都是返回零。
- 不能整除的情况下,C style 风格的几种语言(c,java,js,php)输出的结果一致,另外几种语言(lua,perl,python,ruby)输出的结果一样,但与 C style 的结果不一样,shell 最特殊。
PHP 手册上面明确说明:取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。计算规则是先按被除数和除数的绝对值进行计算,然后按规定相应地符号。
Python 取模的结果符号与除数一致。Python 取模运算两个操作数一正一负的情况下比 PHP 要复杂,具体怎么算的请看这里。Python2 的负数除法也有点奇怪啊,-26 / 20 的结果不是 -1 而是 -2,完全不符合直觉啊。Python3 里面 -26 / 20 的值是 -1.3。