1. ホーム
  2. python

[解決済み] Python は整数を次の100に切り上げます。

2023-01-19 03:15:16

質問

すでに何百回も質問されているようですが、浮動小数点数の丸めに関する関数しか見当たりません。どのように私は、例えば、整数を丸めるのですか? 130 -> 200 ?

どのように解決するのですか?

丸めは一般的に浮動小数点数に対して行われますが、ここでは知っておくべき3つの基本的な関数を紹介します。 round (最も近い整数に丸める)。 math.floor (常に切り捨て)、そして math.ceil (常に切り上げ)です。

整数と百の切り上げについて尋ねていますが、私たちはまだ math.ceil を使うことができます。 53 . 使用方法 math.ceil を使うには、まず100で割って切り上げ、その後に100をかければいいのです。

>>> import math
>>> def roundup(x):
...     return int(math.ceil(x / 100.0)) * 100
... 
>>> roundup(100)
100
>>> roundup(101)
200

先に100で割ってから100を掛けると、小数点以下2桁が左右にずれるので、次のようになります。 math.ceil は百の位で動作します。次のようにします。 10**n は 100 の代わりに 10 に丸めたい場合 ( n = 1 )、千単位( n = 3 ) など。

これを行う別の方法は、浮動小数点数を避け(精度に制限がある)、代わりに整数だけを使うことです。Pythonでは整数は任意の精度を持つので、これによってどんな大きさの数でも丸めることができます。丸めのルールは簡単で、100で割った余りを求め、それが0でなければ100からその余りを引いたものを足すというものです。

>>> def roundup(x):
...     return x if x % 100 == 0 else x + 100 - x % 100

これはどのような大きさの数字に対しても有効です。

>>> roundup(100)
100
>>> roundup(130)
200
>>> roundup(1234567891234567891)
1234567891234567900L

2つのソリューションのミニベンチマークをやってみました。

$ python -m timeit -s 'import math' -s 'x = 130' 'int(math.ceil(x/100.0)) * 100'
1000000 loops, best of 3: 0.364 usec per loop
$ python -m timeit -s 'x = 130' 'x if x % 100 == 0 else x + 100 - x % 100'
10000000 loops, best of 3: 0.162 usec per loop

に比べて、純粋な整数解は2倍速くなります。 math.ceil ソリューションと比較して2倍高速です。

Thomas は、ブール値の乗算によるトリックを使用することを除いて、私が上に持っているものと同一の整数ベースの解決策を提案しました。この方法でコードを書くことによる速度の利点がないことは興味深いことです。

$ python -m timeit -s 'x = 130' 'x + 100*(x%100>0) - x%100'
10000000 loops, best of 3: 0.167 usec per loop

最後に、101-149 を 100 に、150-199 を 200 に丸めたい場合、例えば、丸め先の 最も近い 100 に丸めたい場合、組み込みの round 関数がそれを行うことができます。

>>> int(round(130, -2))
100
>>> int(round(170, -2))
200