首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高精度的ceil函数

高精度的ceil函数
EN

Stack Overflow用户
提问于 2014-09-10 20:36:57
回答 4查看 2.5K关注 0票数 2

如何用高精度将一个数字集合到下一个整数?

代码语言:javascript
复制
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)

我怎样才能优雅地做这个手术?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-10 20:41:19

在Python 2中,这是:

代码语言:javascript
复制
>>> var1 = 8193/4096

不会像你想的那样做。在Python 2中,除以两个整数总是返回一个整数(截断)作为结果。

代码语言:javascript
复制
>>> 8193/4096
2

然后,...and调用2上的math.ceil()返回2。

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

代码语言:javascript
复制
>>> v = 8193/4096.0
>>> v
2.000244140625
>>> math.ceil(v)
3.0

替代办法:

( a)切换到Python 3,在那里,部门的行为确实与您想要的一样:

代码语言:javascript
复制
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的除法,如下所示:

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2014-09-10 20:44:37

问题:您目前正在进行整数除法,这将隐式计算商的下限并给出整数值。

解决方案:首先将其中一个元素(除数或红利)转换为float

代码语言:javascript
复制
math.ceil( float(8193)/4096 ) 
3.0

或者:将.0添加到其中一个数字的末尾,使其成为浮点数,如下所示:

代码语言:javascript
复制
math.ceil( 8193.0/4096 )
3.0

或者:从division模块导入__future__特性,默认情况下允许Python3划分:

代码语言:javascript
复制
from __future__ import division
math.ceil( 8193.0/4096 )

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

票数 2
EN

Stack Overflow用户

发布于 2014-09-10 20:47:44

代码语言:javascript
复制
-(-8193/4096)

是否精确地进行整数除法,并向上舍入。

因此,这比使用浮标要好得多。

这仅仅是因为a/b楼层,所以-a/b层是否定的,所以-(-a/b)给出了你想要的答案。

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

下面是一个快速的例子,它击败了ceil

代码语言:javascript
复制
>>> -(-10**17 // 3)
33333333333333334
>>> int(ceil(10**17 / 3.0))
33333333333333332
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25774645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档