Why Python's Integer Division Floors ---- python int(6/-132)时答案不一致,向下取整

leetcode150题中有一个步骤: int(6/-132) == 0 or ==-1?

在自己本地python3环境跑是int(6/-132) =0,但是提交的时候确实-1。

查找相关资料解惑:

Why Python‘s Integer Division Floors
为何Python整除运算采用向下取整的规则

今天(又)有人问我,为什么Python中的整除(integer division)返回值向下取整(floor)而不是像C语言中那样向0取整。

在正整数范围内,两者并无实质差别,例如:

>>> 5//2

2

但是当操作数之一为负时,结果是向下取整的,也就是远离0(接近负无穷方向):

>>> -5//2

-3

>>> 5//-2

-3

或许部分人不太适应,数学上有一个较好的解释为何这样做。整除运算(//)和与之密切相关的取模运算(%)满足如下优美的数学关系式(所有变量均为整数):

a/b = q 余数为 r

b * q + r = a 而且 0 <= r < b (假设a和b都>=0)

如果希望将这一关系扩展到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 中的 / 有可能产生歧义,因为对两个操作数都是整数时或者一个整数一个浮点数或者两个都是浮点数时,返回的结果类型不同。当然,这是另外的故事,详情参见PEP238

Reference:

[1] http://python3.blogspot.com/2010/08/why-pythons-integer-division-floors.html  需要墙

[2] http://blog.sina.com.cn/s/blog_6a6c136d0101iukq.html

Why Python's Integer Division Floors ---- python int(6/-132)时答案不一致,向下取整

原文地址:https://www.cnblogs.com/hoojjack/p/12019826.html

时间: 2024-08-26 07:59:42

Why Python's Integer Division Floors ---- python int(6/-132)时答案不一致,向下取整的相关文章

Python 之 向上取整、向下取整以及四舍五入

python 向上取整ceil 向下取整floor 四舍五入round,相面给出源码示例. import math #向上取整 print "math.ceil---" print "math.ceil(2.3) => ", math.ceil(2.3) print "math.ceil(2.6) => ", math.ceil(2.6) #向下取整 print "\nmath.floor---" print &q

python两种除法区别以及向上向下取整

python两种除法 在Python中,有两种除法,一种除法是/: 10 / 3 3.3333333333333335 /除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数: 9/3 3.0 还有一种除法是//,称为地板除(floor),两个整数的除法仍然是整数: 10 // 3 3 整数的地板除//永远是整数,即使除不尽.要做精确的除法,使用/就可以. 因为//除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数: 10 % 3 3 另外//除可以看

python 向上取整ceil 向下取整floor 四舍五入round

#encoding:utf-8import math #向上取整print "math.ceil---"print "math.ceil(2.3) => ", math.ceil(2.3)print "math.ceil(2.6) => ", math.ceil(2.6) #向下取整print "\nmath.floor---"print "math.floor(2.3) => ", ma

asp.net C# int 类型在32/64位环境下取值范围无变化

最近在学习中突然想到,我在64位环境下,int取值范围是否有变化?为了检测这个结果,我做了以下这个测试:1.环境:win7旗舰版64位+vs2010 sp1(版本号:10.0.40219.1SP1Rel)+.Net 4.0.30319 SP1Rel2.代码: 代码如下 复制代码 using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplicatio

python小数取整

1. round() 四舍五入    abs() 求绝对值     math.floor() 向下取整 import math 调用math模块 #int()进行转换的时候 自动向下取整     math.ceil() 向上取整     from math import sqrt 直接从模块中调用函数 用sqrt()即可     可以直接将函数赋值给一个变量进行使用:foo=math.floor  直接使用foo()即可     cmath.sqrt()可对负数进行开方 负数的后缀为j pyth

Python 向上取整的算法

一.初衷: 有时候我们分页展示数据的时候,需要计算页数.一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 页. 一般的除法只是取整数部分,达不到要求. 二.方法: 1.通用除法: UP(A/B) = int((A+B-1)/B) 取临界值,计算下A+B-1的范围就OK. 2 .Python除法: 首先要说的是python中的除法运算,在python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法. 当使用x/y形式进行除法运算时,如果

Supporting Python 3(支持python3)——为Python 3做准备

为Python3作准备 在开始添加Python 3的支持前,为了能够尽可能地顺利过度到Python 3,你应该通过修改对2to3来说很难苦的东西来给你的代码做一些准备.即使你现在不打算迁移到Python 3,有一些事你也可以现在就做,这些事在一些情况下它们甚至会加快你的代码在Python 2下的运行. 你可能想要读在I用现代的用句来改善你的代码 上包含许多其他一些你能够用到你的代码中的改进的章节. 在Python 2.7下运行 这个过程的第一步是让你的代码在Python 2.6或者2.7下运行.

python的强制转换(当出现 not supported between instances of &#39;str&#39; and &#39;int&#39; 的错误时)

当我们编程时,有时会出现如下错误:TypeError: '>' not supported between instances of 'str' and 'int' 如下图: 这是因为input()返回的数据类型是str类型,不能直接和整数进行比较,必须先把str转换成整型,使用int()方法:age = int(input ("请输入你的年龄:")) 改正之后为: 这样程序就达到了预期的效果了 python的强制转换(当出现 not supported between inst

python公司面试题集锦 python面试题大全

问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x 答案 以上代码的