2

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

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

4 回答 4

4

在 Python 2 中,这是:

>>> var1 = 8193/4096

不做你认为它做的事。在 Python 2 中,将两个整数相除总是返回一个整数(截断)作为结果。

>>> 8193/4096
2

...然后调用math.ceil()2 返回 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
于 2014-09-10T20:41:19.747 回答
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
于 2014-09-10T20:47:44.543 回答
2

问题:您当前正在进行整数除法,这将隐式计算商的下限并为您提供整数值。

解决方案:将其中一个元素(除数或被除数)转换为float第一个:

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

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

math.ceil( 8193.0/4096 )
3.0

division:从模块导入功能__future__以默认允许 Python 3 划分:

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

Python 3:然而,在 Python 3 中,/是真正的划分,所以你不必担心上面的问题。在那里,如果您想复制遇到的问题,则必须使用//整数除法。//所有 Python 版本的功能都是相同的。

于 2014-09-10T20:44:37.033 回答
1

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

def myceil(x, y):
    return (x + y - 1) // y
于 2014-09-10T20:54:39.660 回答