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 では、2 つの整数を除算すると、結果として常に (切り捨てられた) 整数が返されます。

>>> 8193/4096
2

...そして、2 を呼び出すmath.ceil()と 2 が返されます。

値の 1 つまたは両方を浮動小数点値に変換すると、好きなことが行われます。

>>> 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

問題: 現在、整数除算を行っています。これにより、暗黙的に商の下限が計算され、整数値が得られます。

解決策:要素 (除数または被除数) の1 つfloatを最初にキャストします。

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

OR : 次のように、数字の 1 つの末尾に追加して float にするだけです。.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 に答える
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 に答える
1

もう1つの純粋な整数の方法は、私にとっては二重否定を使用したアプローチよりも少し直感的ですが、正の場合にのみ機能しyます:

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