ceil功能高精度

时间:2014-09-10 20:36:58

标签: python python-2.7 integer-division ceil

如何以高精度将数字四舍五入到下一个整数?

Input: var1 = (8193/4096) # var1 = 2.00024414063
Output: 3 # As an integer

>>> var1 = 8193/4096
>>> import math
>>> math.ceil(var1)
2.0
>>> math.ceil(8193/4096)
2.0
>>> import numpy
>>> numpy.ceil(8193/4096)

我怎样才能优雅地完成这项操作?

4 个答案:

答案 0 :(得分:4)

在Python 2中,这个:

>>> var1 = 8193/4096

没有做你认为的事情。在Python 2中,除以两个整数总是返回一个整数(截断)作为结果。

>>> 8193/4096
2

...然后在2上调用math.ceil()返回2。

将您的一个或两个值转换为浮点值,它会执行您喜欢的操作:

>>> v = 8193/4096.0
>>> v
2.000244140625
>>> math.ceil(v)
3.0

备选方案:

a)切换到Python 3,其中除法的行为与你想要的一样:

bgporter@zappa:~$ python3
Python 3.4.0 (default, Apr 11 2014, 13:05:18)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 8193/4096
2.000244140625
>>>

b)在Python 2上启用Python 3的分区:

bgporter@varese ~:python
Python 2.7.5 (default, Mar  9 2014, 22:15:05)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import division
>>> 8193/4096
2.000244140625

答案 1 :(得分:2)

问题:您当前正在执行整数除法,它会隐式计算商的最低限度并为您提供整数值。

解决方案:首先将一个元素(除数或红利)投射到float

math.ceil( float(8193)/4096 ) 
3.0

OR :只需设为即可将.0添加到其中一个数字的末尾,如下所示:

math.ceil( 8193.0/4096 )
3.0

OR :从division模块导入__future__功能,默认允许Python 3分区:

from __future__ import division
math.ceil( 8193.0/4096 )

Python 3 :但是,在Python 3中,/是真正的分区,因此您不必担心上述情况。在那里,如果要复制您遇到的问题,则必须使用//进行整数除法。所有Python版本的//功能都是相同的。

答案 2 :(得分:2)

-(-8193/4096)

完全整数除法,并向上舍入。

因此它比涉及花车更好。

仅仅因为a/b楼层,所以-a/b落后于负面,所以-(-a/b)会为您提供所需的答案。

要支持Python 3(总是一个好主意),请使用-(-8193//4096)


这是一个快速示例,它击败ceil

>>> -(-10**17 // 3)
33333333333333334
>>> int(ceil(10**17 / 3.0))
33333333333333332

答案 3 :(得分:1)

另一种纯整数方式,对我来说比双重否定的方法更直观,虽然它仅适用于正y

def myceil(x, y):
    return (x + y - 1) // y