如何在Python中实现圆无穷除法

如何在Python中实现圆无穷除法,python,math,floating-point,rounding,division,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?) 除了我想要的: "function"(3/2) = 2 当你除以两个整数时,结果是一个整数。 3/2等于1,而不是1.5 见,注1: 对于(普通或长)整数除法,结果为整数。结果总是向负无穷大取整:

我希望3/2等于2,而不是1.5

我知道这个运算有一个数学术语(不叫取整),但我现在想不起来了。 不管怎样,我如何做到这一点而不必做两个函数

除了我不想要的:

answer = 3/2 then math.ceil(answer)=2 (why does math.ceil(3/2)=1?)  
除了我想要的:

 "function"(3/2) = 2

当你除以两个整数时,结果是一个整数。
3/2
等于
1
,而不是
1.5

见,注1:

对于(普通或长)整数除法,结果为整数。结果总是向负无穷大取整:1/2为0,(-1)/2为-1,(-2)为-1,(-1)/2为0。请注意,如果任意一个操作数是长整数,则结果都是长整数,而与数值无关

一旦您从部门获得
1
,就无法将其转换为
2

要获得
1.5
,您需要浮点除法:
3.0/2

然后可以调用
math.ceil
获取
2

你错了;没有一个数学函数是先除法,然后取整的。

您所能做的最好的事情就是编写自己的函数,该函数使用两个浮点值并调用Python 3中的
math.ceil

整数除法:

3//2==1

Python 3中的非整数除法:

3/2==1.5


你所说的绝对不是除法。

你可能想要的是:

math.ceil(3.0/2.0)
# or
math.ceil(float(3)/float(2))
您还可以从future执行导入:

from __future__ import division
math.ceil(3/2) # == 2
但是,如果执行此操作,要获取整数除法的当前行为,需要使用双斜杠:

3 // 2 == 1 # True
给一个简短的回答

Python只为两种类型的除法提供本机运算符:“真”除法和“向下舍入”除法。因此,您需要的功能不能作为单个功能提供。但是,可以使用一些简短的表达式轻松实现许多不同类型的除法和舍入

根据标题的要求:给定严格的整数输入,“向上取整”除法可以使用
(a+(-a%b))//b来实现,而“从零取整”除法可以使用更复杂的
a//b来实现,如果a*b0 else(a+(-a%b))//b


  • “从零开始四舍五入”又名“向(任意)无限方向四舍五入”除法——不幸的是,这比向零方向四舍五入更为棘手。我们不能再利用
    int
    操作符的截断行为了,所以即使包含浮点运算,我也想不出一个简单的表达式。因此,我必须使用舍入到零表达式的倒数,如果a*b则使用
    a//b。OP问题的目的是“如何在Python中实现舍入到无穷大的除法”(建议您更改标题)

    根据(read),这是一种完全合法的舍入模式,术语是“向无穷大舍入”(或“从零舍入”)。9张落选票中的大多数都不公平地抨击了OP。是的,在本机Python中没有单一的函数方法可以做到这一点,但我们可以使用
    轮(float(a)/b)
    或子类
    numbers.Number
    和override
    \uu div\uuuuu()

    OP需要澄清他们是希望-3/2四舍五入到-2还是-1(或者不关心负操作数)。既然他们已经说过不想向上取整,我们可以推断-3/2应该向上取整为-2

    足够的理论。对于实现:

    • 如果您只想使用快速且肮脏的单行解决方案来实现无穷大的圆,请使用
      round(float(a)/b)
    • math.ceil(float(a)/b)
      向上取整,这是您说过不想要的

    • 但是,如果这是您的默认除法运算,或者您正在执行很多除法运算,那么请像下面的伪代码那样执行:,重新定义
      \uuuuu div\uuuuu()
      ,或者定义一个非默认的可选
      \uuuu divra\uuuu()
      运算。您可以定义一个类成员或类方法
      舍入\u模式
      ,并在划分期间查找它。但是要小心
      \uu rdiv\uu()
      和普通浮点数的混合


    我想你要找的是:

    假设你有x(3)和y(2)

    result=(x+y-1)//y

    这相当于不使用浮点的天花板


    当然,y不能是0。

    gmpy2中提供了带上限舍入(to+Inf)、下限舍入(to-Inf)和截断(to 0)的整数除法

    >>> gmpy2.c_div(3,2)
    mpz(2)
    >>> help(gmpy2.c_div)
    Help on built-in function c_div in module gmpy2:
    c_div(...)
        c_div(x,y): returns the quotient of x divided by y. The quotient
        is rounded towards +Inf (ceiling rounding). x and y must be integers.
    >>> help(gmpy2.f_div)
    Help on built-in function f_div in module gmpy2:
    f_div(...)
        f_div(x,y): returns the quotient of x divided by y. The quotient
        is rounded towards -Inf (floor rounding). x and y must be integers.
    >>> help(gmpy2.t_div)
    Help on built-in function t_div in module gmpy2:
    t_div(...)
        t_div(x,y): returns the quotient of x divided by y. The quotient
        is rounded towards 0. x and y must be integers.
    >>>
    
    gmpy2可在


    (免责声明:我是gmpy和gmpy2的当前维护者。)

    首先,您希望在参数中使用浮点除法。使用:

    from __future__ import division
    
    如果您总是想要取整,那么
    f(3/2)==2
    f(1.4)==2
    ,那么您希望
    f
    成为
    math.trunc(math.ceil(x))


    如果您想得到最接近的整数,但要进行四舍五入,则需要
    math.trunc(x+0.5)
    。这样,如果你想要32=2,那当然不是除法。PS
    math.ceil(3/2)=1
    因为
    3/2=1
    (整数除法),所以你是上限1,而不是1.5这是一种合法的舍入形式,术语是。你们中的大多数人都在不公平地抨击OP。是的,在本机Python中,只有一个内置项或fn无法做到这一点。@Null,您混淆了术语。如果您在DSP芯片上编写低级C宏或汇编代码,人们每周都会这样做(参考下文)。如果您的意思是“高级语言规范”中没有看到这一点,那么是的。有大量的数学运算没有内置的直接高级语言算术运算,例如2^N点快速傅里叶变换、卷积、相关、拉普拉斯变换,你可以说。。。关键是OP的问题是合法的(尽管很少见到),而反对票是错误的。没问题。一些r
    from __future__ import division