负数取模运算(转)

不同语言里面,对于整数除法取整的处理方式并不一样。

  • C/Java 的处理方式
    大多数语言的处理方式都与 C/Java 一致,采用了 truncate 除法。所以在 C/Java 语言中:
    -17 % 10 的计算结果如下:r = (-17) - (-17 / 10) x 10 = (-17) - (-1 x 10) = -7
    17 % -10 的计算结果如下:r = 17 - (17 / -10) x (-10) = (17) - (-1 x -10) = 7
    -17 % -10 的计算结果如下:r = (-17) - (-17 / -10) x (-10) = (-17) - (1 x -10) = -7

  • Python 的处理方式
    Python 语言除法采用的是 floor 除法,所以对 Python 程序员来讲:
    -17 % 10 的计算结果如下:r = (-17) - (-17 / 10) x 10 = (-17) - (-2 x 10) = 3
    17 % -10 的计算结果如下:r = 17 - (17 / -10) x (-10) = (17) - (-2 x -10) = -3
    -17 % -10 的计算结果如下:r = (-17) - (-17 / -10) x (-10) = (-17) - (1 x -10) = -7
    据说,Python 3.x 中「/」运算符的意义发生了变化,「/」产生的结果将不会再进行取整,相应的「//」运算符的结果才会进行取整。

  • Common Lisp 的处理方式
    Common Lisp 的特殊操作符「/」的结果是分数,因此不会存在截尾的问题。但是 Common Lisp 提供了 TRUNCATE 函数和 FLOOR 函数分别对应上述的两种除法。相应的,Common Lisp 的 REM 函数类似于 C/Java 语言中的取模运算;而 MOD 函数类似于 Python 语言中的取模运算。
    例如,在 Clojure 这门 Lisp 方言中,(rem -17 10) == -7,(mod -17 10) == 3



作者:丰俊文
链接:https://www.jianshu.com/p/452c1a5acd31
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/suangsuan/p/12544407.html
今日推荐