Kbo*_*bob 8 python math floating-point rounding division
我希望3/2等于2而不是1.5
我知道这个操作有一个数学术语(不称为四舍五入),但我现在不记得了.无论如何,我怎么做而不必做两个功能?
我不想要的东西:
answer = 3/2 then math.ceil(answer)=2 (why does math.ceil(3/2)=1?)
Run Code Online (Sandbox Code Playgroud)
我想做的事情:
"function"(3/2) = 2
Run Code Online (Sandbox Code Playgroud)
Eli*_*ins 16
简短回答......
Python只提供两种类型的本地运算符:"true"除法和"舍入"除法.所以你想要的不是单一功能.然而,可以使用一些短表达式容易地实现许多不同类型的舍入除法.
根据标题的要求:给定严格的整数输入,可以使用"向上舍入"除法(a+(-a%b))//b,并且可以使用更复杂的"舍入零"除法来实现a//b if a*b<0 else (a+(-a%b))//b.其中一个可能就是你想要的.至于为什么......
给出更长的答案......
首先,让我回答关于为什么3/2==1以及math.ceil(3/2)==1.0通过解释Python除法运算符如何工作的问题.有两个主要问题在起作用......
floatvs intdivision:在Python 2下,除法根据输入的类型而有所不同.如果两个a和b是整数,a/b进行"四舍五入"或"楼整数"划分(如3/2==1,但-3/2==-2).这相当于int(math.floor(float(a)/b)).
但是如果至少有一个a和b是浮点数,Python会执行"真正的"除法,并给你一个float结果(例如3.0/2==1.5,和-3.0/2==-1.5).这就是为什么你有时会看到结构float(a)/b:它被用来强制真正的除法,即使两个输入都是整数(例如float(3)/2==1.5).这就是你的例子math.ceil(3/2)返回的原因1.0,而math.ceil(float(3)/2)返回2.0.结果在它到达之前已经被舍入math.ceil().
默认情况下为"真正的划分":在2001年,决定(PEP 238)应该改变Python的除法运算符,使得它总是执行"真正的"除法,无论输入是浮点数还是整数(例如,这会产生3/2==1.5) .为了不破坏现有脚本,默认行为的更改推迟到Python 3.0; 为了在Python 2.x下获得此行为,您必须通过添加from __future__ import division到文件顶部来为每个文件启用它.否则使用旧的依赖于类型的行为.
但是仍然经常需要"向下"分组,所以PEP并没有完全采用它.相反,它引入了一个新的除法运算符:a//b它总是执行向下舍入,即使输入包含浮点数.这可以在Python 2.2+和3.x下使用而不做任何特殊操作.
就这样,分为四舍五入:
为了简化操作,以下表达式a//b在处理整数时都使用运算符,因为它在所有python版本下的行为都相同.同样,我假设0<=a%b<bif b是正数,b<=a%b<=0如果b是负数.这就是Python的行为方式,但其他语言的模数运算符可能略有不同.
四舍五入的四种基本类型:
"round down"又名"floor integer"又名"round to minus infinity"divsion:python提供这个本地的via a//b.
"round up"又名"ceiling integer"又名"round to positive infinity"分区:这可以通过int(math.ceil(float(a)/b))或者实现(a+(-a%b))//b.后一个等式可以工作,因为-a%b如果是0 a的倍数,则为0 b,否则我们需要添加a到达下一个最高倍数的量.
"向零舍入"又称"截断"除法 - 这可以通过实现int(float(a)/b).在不使用浮点的情况下执行此操作比较棘手......因为Python只提供向下舍入整数除法,并且%运算符具有类似的向下舍入偏差,所以我们没有任何非浮点运算符,这些运算符对称地围绕0舍入.所以我能想到的唯一方法就是从圆形和圆形构造一个分段表达式:a//b if a*b>0 else (a+(-a%b))//b.
"圆远离零"又称"圆到(无论)无限"分裂 - 不幸的是,这甚至比圆向零更棘手.我们不能再利用int运算符的截断行为了,所以即使包含浮点运算,我也不会想到一个简单的表达式.所以我必须使用从零到零的表达式的逆,并使用a//b if a*b<0 else (a+(-a%b))//b.
请注意,如果您只使用正整数,则(a+b-1)//b提供比上述任何解决方案更有效的向上/远离零,但是对于负数而言则分开.
希望有帮助......并且很高兴能够编辑,如果有人可以建议更好的方程式来回零/远离零.我发现那些我特别不满意的.
当您除两个整数时,结果是一个整数。
3 / 2等于1,不1.5。
请参阅文档,注释 1:
对于(普通或长)整数除法,结果是整数。结果始终向负无穷大舍入:1/2 为 0,(-1)/2 为 -1,1/(-2) 为 -1,(-1)/(-2) 为 0。请注意如果任一操作数是长整数,则无论数值如何,结果都是长整数。
一旦从部门出来1,就没有办法把它变成2。
要获得1.5,您需要浮点除法:3.0 / 2。
然后您可以致电math.ceil获取2。
你误会了; 没有数学函数可以进行除法然后向上舍入。
您能做的最好的事情就是编写自己的函数,该函数接受两个浮点数并调用math.ceil。