web-dev-qa-db-ja.com

Pythonでははどのように数値を切り上げますか?

この問題は私を殺しています。 Pythonで1つの切り上げはどのようにして数を増やすのですか?

私は試してみました(number)が、それは数を切り捨てました。例:

round(2.3) = 2.0 and not 3, what I would like

私はint(number + .5)を試しましたが、それはまた数を切り捨てます!例:

int(2.3 + .5) = 2

それから私はラウンド(番号+ .5)を試したが、それはエッジの場合には動作しません。例:

WAIT! THIS WORKED!

お知らせ下さい。

384
bodacydo

ceil (天井)関数:

import math
print(math.ceil(4.2))
706
Steve Tjoa

心に留めておくべき興味深いPython 2.x問題:

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

問題は、2つのintをpythonで分割すると別のintが生成され、上限呼び出しの前に切り捨てられることです。正しい結果を得るためには、ある値をfloat(またはキャスト)にする必要があります。

JavaScriptでは、まったく同じコードでは異なる結果になります。

console.log(Math.ceil(4500/1000));
5
146
TrophyGeek

私はこの答えがしばらく前からの質問に対するものであることを私は知っています、しかしあなたが数学をインポートしたくない、そしてあなたが単に切り上げたいのであれば、これは私のために働く。

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

最初の部分は4になり、残りがあれば2番目の部分は "True"に評価されます。 False =0。したがって、余りがない場合は同じ整数のままになりますが、余りがある場合は1が加算されます。

135
user3074620

整数を扱う場合、切り上げの1つの方法は、//が切り捨てるという事実を利用することです。負の数で除算をして、答えを否定します。インポート、浮動小数点、条件付きは不要です。

rounded_up = -(-numerator // denominator)

例えば:

>>> print(-(-101 // 5))
21
74
David Bau

あなたは派手で好きかもしれません:

>>> import numpy as np
>>> np.ceil(2.3)
3.0

数学より優れているとは言っていませんが、他の目的で既にNumpyを使用している場合は、コードの一貫性を保つことができます。

とにかく、私が出くわしたのは詳細だけです。私はたくさんゴツゴツしていて、それが言及されていないことに驚きましたが、もちろん受け入れられた答えは完全にうまくいきます。

48
Lisa

切り上げるにはmath.ceil を使用します。

>>> import math
>>> math.ceil(5.4)
6.0

_ note _ :入力はfloatでなければなりません。

整数が必要な場合は、intを呼び出して変換します。

>>> int(math.ceil(5.4))
6

ところで、downを四捨五入するにはmath.floorを、最も近い整数に丸めるにはroundを使用してください。

>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)
23
kennytm

構文はPythonicのものとは異なるかもしれませんが、強力なライブラリです。

https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
11
NuclearPeon

びっくりした人は誰もいない

(numerator + denominator - 1) // denominator

切り上げを伴う整数除算用。 C/C++/CUDAの一般的な方法として使用されていました(divupを参照)。

8
Andreas Schuh

丸みを帯びた値はfloatにする必要があります

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

しかし

print math.ceil(float(a) / b)
>>> 1.0
7
Alexey
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

この機能はモジュールを必要としません。

6
PonasM

上記の答えは正しいのですが、この1つの関数のためだけにmathモジュールをインポートすることは、通常私にとってはやり過ぎのように感じます。幸いなことに、それを行うための別の方法があります。

g = 7/5
g = int(g) + (not g.is_integer())

TrueFalseは、pythonの数値を含む文では10として解釈されます。 g.is_interger()は基本的にg.has_no_decimal()またはg == int(g)に変換されます。そのため、英語の最後の文はround g down and add one if g has decimalです。

5
Nearoo

基本的な環境を使って数学をインポートせずに//

a)メソッド/クラスメソッド

def ceil(fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

def ceil(self, fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

b)ラムダ:

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)
5
Kuřátko Zvyk

これを試して:

a = 211.0
print(int(a) + ((int(a) - a) != 0))
5
user3712978

a / bを切り上げて整数にしたい人のために:

整数除算を使用するもう1つの変形は

def int_ceil(a, b):
    return (a - 1) // b + 1

>>> int_ceil(19, 5)
4
>>> int_ceil(20, 5)
4
>>> int_ceil(21, 5)
5
3
Pavel

私はまだこの答えを見ていないのには驚いていますround(x + 0.4999)、それで私はそれを置くつもりです。これはPythonのどのバージョンでも動作することに注意してください。 Pythonの丸め方式を変更したため、処理が困難になりました。これを見なさい ポスト

インポートせずに、私は使用します:

def roundUp(num):
    return round(num + 0.49)

testCases = list(x*0.1 for x in range(0, 50))

print(testCases)
for test in testCases:
    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))

なぜこれが機能するのか

ドキュメントから

Round()をサポートする組み込み型の場合、値は10の累乗からnを引いた値の最も近い倍数に丸められます。 2の倍数が等しく近い場合、丸めは偶数の選択に向かって行われます

したがって、2.5は2に丸められ、3.5は4に丸められます。これが当てはまらない場合は、0.5を加えることで切り上げることができますが、中間点に到達しないようにします。したがって、0.4999を追加すると近づきますが、通常予想される値に丸めるのに十分なマージンがあります。もちろん、これはx + 0.4999[n].5000と等しい場合は失敗しますが、それはありそうもないです。

2
Klik

インポートせずにそれを行うには:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3
0
gorttar

私はこれがかなり前からあることを知っています、しかし私はかなり興味深い答えを見つけました、それでここに行きます:

-round(-x-0.5)

これは、エッジの場合を修正し、正数と負数の両方に対して機能し、関数のインポートを必要としません。

乾杯

0
Fenmaz

何もインポートしたくない場合は、常に次のように独自の単純な関数を書くことができます。

def RoundUP(num): if num== int(num): return num return int(num + 1)

0
Sebin

4500/1000をPythonで操作すると、結果は4になります。デフォルトのpythonでは、整数で結果を論理的に仮定します。4500/1000= 4.5 - > int(4.5)= 4で、ceil of 4は明らかに4です。

4500/1000.0を使用すると、結果は4.5になり、4.5からceilになります - > 5

JavaScriptを使用すると、4500/1000の結果として4.5を受け取ることになります。これは、javascriptが結果のみを "数値型"として想定し、結果を直接floatとして返すためです。

がんばろう!!

0
erick vicente