加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【Python】Python中负数的除法和取模运算(和C比较)

(2014-04-05 18:12:09)
标签:

python

取模运算

it

分类: Python笔记

一、除法:

除法的取整分为三类:向上取整、向下取整、向零取整。 
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采用的是向下取整的方式,具体原因得结合取模运算分析。

二、取模:

如果 a/b = q, a%b = r (可表示为a/b=q … r)

#在python中,遇到取模运算时,可以先用向下取整的方式算出q,然后结合下面的公式算出r。

那么 a = b*q + r

#当a小于b时(a>0, b>0),r = a,因为这时q = 0

  在C语言中,%符号表示的是求余运算。根据C语言中除法结果向零取整的规则,5 % 3 = 2, -5 % -3 = -2, -5 % 3 = -2, 5 % -3 = 2

即:

a b q r
5 3 1 2
-5 -3 1 -2
-5 3 -1 -2
5 -3 -1 2

  在python中,%表示的是取模(通常取模运算中b不允许是负数,但是在python 2.5.1里可以在%后面跟负数)。这时:

a b q r
5 3 1 2
-5 -3 1 -2
-5 3 -2 1
5 -3 -2 -1

    注意:上面两个表格中最后两行结果是不同的。

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

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

------------------------更多比较---------------------------

 

     a    
     
C语言:a%b   (求余)
Python Shell: a%b(取模)
-3 -5 -3 -3
-3 4 -3 1
-3 2 -1 1
-1 6 -1 5
-4 -3 -1 -1
2 4 2 2
5 3 2 2
4 -7 4 -3
4 -3 1 -2
-6 -5 -1 -1


参考:

http://www.cnblogs.com/zijin/p/3468802.html

http://blog.csdn.net/zhangjian33446/article/details/11958517


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有