首页 文章

在Python中截断与删除分区

提问于
浏览
5

为了 Build 上下文,我只讨论整数运算,在大整数上,所以通过浮点不是一个选项,并使用负数,所以floored和truncated division之间的区别很重要 .

当对负整数执行除法时,典型的硬件和C族编程语言给出截断的结果,例如1 / -2 = 0.Python 2给出了内置结果,例如1 / -2 = -1 .

尽管有关哪个本质上更好的论点,有没有办法让Python给出截断的结果?如果使用Python 3而不是2,它会有什么不同吗?

4 回答

  • 1

    好吧,如果你只是想要一个解决方案,请记住 int 截断数字,所以不要做整数除法,而是用 int 截断浮点数

    int(1./-2)
    

    如果您使用的是Python 3.X,那么您可以这样做

    int(1/2)
    

    如果你希望将来在Py 2.X import division中有相同的行为

    from __future__ import division
    int(1/2)
    

    如果您想知道这种行为的确切原因,请阅读这篇精彩的文章Why Python's Integer Division Floors


    看看你使用float进行划分的困境,这是一种替代方法,就我测试而言似乎正在起作用 . 请随时告诉我您遇到的任何问题

    >>> def trunc_div(a,b):
        q, r = divmod(a,b)
        if  q < 0 and r:
            q += 1
        return q
    
    >>> trunc_div(1,-2)
    0
    >>> trunc_div(999999999999999999999999999999999999999999, -2)
    -499999999999999999999999999999999999999999L
    >>> trunc_div(999999999999999999999999999999999999999999, 2)
    499999999999999999999999999999999999999999L
    >>> trunc_div(1,2)
    0
    >>>
    
  • 1

    Python 3具有新式划分(也可以在Python 2中使用 from __future__ import division 触发):

    >>> from __future__ import division
    >>> -1 / 2
    -0.5
    >>> -1 // 2
    -1
    

    我不认为你可以得到截断的除法,你可能不得不使用math.floor() .

  • 0

    我认为这解决了你的问题,但它是一个函数调用,而不是一个简单的操作:

    def truncdiv(a, b):
        if a < 0:
            a = -a
            b = -b
        if b < 0:
            return (a + b + 1) / b
        return a / b
    
  • 7

    gmpy2库支持截断的除法:

    >>> import gmpy2
    >>> gmpy2.mpz(-100)//7
    mpz(-15)
    >>> gmpy2.t_div(gmpy2.mpz(-100),7)
    mpz(-14)
    >>>
    

    免责声明:我维持gmpy2 .

相关问题