除法的取整分为三类:向上取整、向下取整、向零取整。

1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 2, -5 / -3 = 2, -5 / 3 = -1, 5 / -3 = -1 
2.向下取整:向-∞方向取最接近精确值的整数。在这种取整方式下,5 / 3 = 1, -5 / -3 = 1, -5 / 3 = -2, 5 / -3 = -2 
3.向零取整:向0方向取最接近精确值的整数,换言之就是舍去小数部分,因此又称截断取整。在这种取整方式下,5 / 3 = 1, -5 / -3 = 1, -5 / 3 = -1, 5 / -3 = -1

通过观察可以发现,无论是向上取整还是向下取整,(-a)/b==-(a/b)都不一定成立。这给程序设计者带来了极大的麻烦。而对于向零取整,(-a)/b==-(a/b)是成立的,以此,C/C++(包括Java)采用这种取整方式。

而Python采用的是向下取整的方式

  C/C++ Python 精确值
-14/3 -4 -5 -4.67
-14%3 -2 1 /
14/-3 -4 -5 -4.67
14%-3 2 -1 /
-14/-3 4 4 4.67
-14%-3 -2 -2 /

总结规律如下:

  1. 两种语言中,商和余数都符合 被除数=商x除数+余数 这一数学规律。
  2. 两种语言中,整除的方法不同:C/C++ 是向零取整(负数向上、正数向下取整),Python 是下取整

以 n/3 和 n%3 为例,看看这两种处理方法的区别。

C 的情况,两种运算结果都关于0对称和反号

n -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5
-1 -1 -1 0 0 0 0 0 1 1 1
余数 -2 -1 0 -2 -1 0 1 2 0 1 2

Python 的情况,运算结果是完全连续的:

n -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5
-2 -2 -1 -1 -1 0 0 0 1 1 1
余数 1 2 0 1 2 0 1 2 0 1 2

那么,为何Python整除运算采用向下取整的规则,详细内容在Why Python's Integer Division Floors?,简单地来讲就是:

因为python认为余数r用到的机会会更大,采用向下取整的规则可以保证余数r与除数b的符号相同(同正或者同负)。以下为重点内容的摘抄:


假设a和b都>=0时,

b * q + r = a, 0 <= r < b

如果希望将这一关系扩展到a为负(b仍为正)的情况,有两个选择:一是q向0取整,r取负值,这时约束关系变为 0 <= abs(r) < b,另一种选择是q向下(负无穷方向)取整,约束关系不变,依然是 0 <= r < b。

在数学的数论中,数学家总是倾向于第二种选择(参见如下Wikipedia链接)。

在Python语言中也做了同样选择,因为在某些取模操作应用中被除数a取什么符号并不重要。

例如从POSIX时间戳(从1970年初开始的秒数)得到其对应当天的时间。因为一天有24*3600 = 86400秒,这一操作就是简单的t % 86400。但是当表达1970年之前的时间,这时是一个负数,向0取整规则得到的是一个毫无意义的结果!而向下取整规则得到的结果仍然是正确的。 
另外一个我能想到的应用是计算机图形学中计算像素的位置。我相信这样的应用还有更多。

顺便说一下,b取负值时,仅需要把符号取反,约束关系变为: 
0 >= r > b 
那么,现在的问题变成,C为啥不采取(Python)这样的选择呢?可能是设计C时硬件不适合这样做,所谓硬件不适合这样做是说指那些最老式的硬件把负数表示为“符号+大小”而不是像现在的硬件用二进制补码表示(至少对整数是用二进制补码)。我的第一台计算机是一台Control Data大型机,它用1的补码来表示整数和浮点数。60个1的序列表示负0! 
Tim Peters对Python的浮点数部分洞若观火,对于我想把这一规则推广到浮点数取模运算有些担心。可能他是对的,因为向负无穷取整的规则有可能导致当x是绝对值特别小的负数时x%1.0会丢失精度。但是这还不足以让我对整数取模,也就是//进行修改。 
附言:注意我用了//而不是/,这是一个Python 3 语法,而且在Python 2 中也是有效的,它强调了使用者是要进行整除操作。Python 2 中的 / 有可能产生歧义,因为对两个操作数都是整数时或者一个整数一个浮点数或者两个都是浮点数时,返回的结果类型不同。

来自:http://cuihao.is-programmer.com/posts/38553.html
http://www.cnblogs.com/zijin/p/3468802.html

负整数的整除与取余运算相关推荐

  1. C语言整除、取余运算的符号问题

    偶然的机会看到这样一个问题2/(-2)的值是多少 ?回顾以往编程经历,只写过正整数整除.取余.整除和取余的操作如下: 1.a = m/n; 2.b = m%n; 这里a,b,m,n满足的关系:a*n ...

  2. python中的取余运算符是_python取余运算

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python中对负数求余的计算方法和求幂运算注意点python中对负数求余的计算 ...

  3. 程序员数学基础【三、取模运算(取余运算功能重叠部分)】(Python版本)

    测试使用语言:[Python] 由于此类语言入门非常容易,哪怕初中生亦可以,并且本科/研究生写论文.做实验多数所用语言都是[Python]故而选择此语言. 代码运行平台:[win10 x64] 代码环 ...

  4. 3位水仙花数计算pythonoj_简述 取模运算Modulo Operation 及其与 取余运算Complementation 区别联系...

    综述: 取模运算("Modulo Operation")和取余运算("Complementation ")两个概念有重叠的部分但又不完全一致.主要的区别在于对负 ...

  5. 信息学奥赛一本通 1326:【例7.5】 取余运算(mod)

    [题目链接] ybt 1326:[例7.5] 取余运算(mod) [题目考点] 1. 快速幂 [解题思路] 快速幂算法,用到了分治思想. 如果指数为奇数,那么结果乘以当前的底数,指数除以2(整除运算) ...

  6. 与运算和取余运算的配对条件

      偶然在一个算法解析中,看到作者用与运算来代替取余运算,感觉属实有点装逼,于是有了钻研一下的想法.   首先通过实验来看看,与运算和取余运算存在一个怎样的关系. for i in range(100 ...

  7. python模运算求余_取模运算和取余运算

    取模运算和取余运算 取模运算( " Modulo Operation " )和取余运算 ( " Complementation " )两个概念有重叠的部分但又不 ...

  8. Python中的取整、取余运算

    1.取整运算 在Python中取整运算的运算符为//,且取整运算的取整为向下取整,不进行四舍五入 例:9//4=2,即9对4取整等于2 -9//-4=2,因为-9÷-4=2.25,取整为2 那么问题来 ...

  9. C语言取模运算(取余运算)

    C语言取模运算(取余运算) 取模算法: 取余(取模)的奥义 C语言运用 取模算法: 取模运算也叫取余运算,在C中用%来表示, 数学中叫mod. x mod y = x%y x%y = x - y[x/ ...

最新文章

  1. 命令行配合sqlplus管理Oracle
  2. Dubbo标签解析原理
  3. 2018 Wannafly summer camp Day3--Knight
  4. 九十、动态规划系列背包问题之多重背包
  5. 【数据结构与算法】循环队列的Java实现
  6. 信息学奥赛C++语言:输出浮点数(1)
  7. Centos6.5+Python2.7 +ffmpeg+opencv2自动安装脚本
  8. SpringBoot 2.0 整合Mybatis详细步骤
  9. UCBCS188 AI学习笔记(1)uninformed search (无启发函数搜索)
  10. 华为畅享max支持鸿蒙,华为手机怎么升级鸿蒙?华为鸿蒙系统支持手机型号大全...
  11. 最新AWVS14.9.220913107 支持Windows使用教程(附下载地址)
  12. 中缀表达式变为后缀表达式
  13. matlab 画温度分布,matlab画温度分布图
  14. 线程基础 第一篇:线程的定义、状态、属性、简单实现线程
  15. 工业机器人打磨抛光编程员工资_工业机器人调试方面,工资高吗?累吗?
  16. python爬虫实战--爬取猫眼专业版-实时票房
  17. Windows Server 2016 企业CA证书的应用
  18. linux系统时钟使用utc,如何设置时间,时区和同步系统时钟使用timedatectl命令
  19. 【网络互联技术】(三) 网络互联基础。
  20. ubuntu设置swap(交换内存)

热门文章

  1. ENA查询SRA并获取相关信息
  2. 对巴菲特投资理念的个人理解,仅供参考
  3. 小鑫吃苹果 3105
  4. ParseInt()的用法
  5. 扩展欧几里得定理详解和运用(就不信你看不懂!)
  6. JavaScript 递归的3个小应用
  7. 优麒麟:打造全球最好用的Linux开源操作系统
  8. H5把页面变灰的方法
  9. Ubuntu系统中/usr/share/applications/目录下都是.desktop文件没有快捷方式
  10. HTTP 报文首部之首部字段(重点分析)