回答:
CEIL(天井)機能:
import math
print(math.ceil(4.2))
int(math.ceil(363))
math.ceil
整数値を持つ浮動オブジェクトだけでなく、実際の整数オブジェクトを返します。
10000000 * 0.00136 = 13600.000000000002
多くを増やすことができます切り上げmath.ceil(10000000 * 0.00136) = 13601.0
この答えはしばらく前の質問に対するものであることは知っていますが、数学をインポートしたくなく、切り上げたいだけの場合は、これでうまくいきます。
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
最初の部分は4になり、残りの部分がある場合、2番目の部分は "True"と評価され、さらにTrue = 1になります。False =0。したがって、剰余がない場合は同じ整数のままですが、剰余がある場合は1が加算されます。
//
整数除算にも使用できるので、これはになり21 // 5 + (21 % 5 > 0)
ます。
float
sはありません。いいね。
心に留めておくべき興味深いPython 2.xの問題:
>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0
問題は、Pythonで2つのintを分割すると別のintが生成され、上限の呼び出しの前に切り捨てられることです。正しい結果を得るには、1つの値を浮動小数点(またはキャスト)にする必要があります。
JavaScriptでは、まったく同じコードで異なる結果が生成されます。
console.log(Math.ceil(4500/1000));
5
整数を扱う場合、切り上げの1つの方法は、切り捨てという事実を利用することです//
。単に負の数で除算を行ってから、答えを否定します。インポート、浮動小数点、または条件は必要ありません。
rounded_up = -(-numerator // denominator)
例えば:
>>> print(-(-101 // 5))
21
(num + den - 1) // den
、これはint
分母が正の入力には問題ありませんが、1つの非整数float
(分子または分母のいずれか)が関係している場合でも失敗します。これはより魔法のように見えますが、int
とfloat
の両方で機能します。小さな分子の場合は(CPython 3.7.2では)高速ですが、奇妙なことに、分子のみが配列ベースの計算が必要なほど大きい場合、アプローチは遅くなります。これはなぜかは明らかではありません。除算の作業は似ているはずであり、2つの単項否定は加算+減算よりも安くなるはずです。
あなたはnumpyも好きかもしれません:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
数学より優れているとは言っていませんが、すでに他の目的でnumpyを使用している場合は、コードの一貫性を保つことができます。
とにかく、私が出会った細部だけ。私はnumpyをたくさん使用していて、言及されていないことに驚いていましたが、もちろん、受け入れられた答えは完全にうまくいきます。
>>> import math
>>> math.ceil(5.4)
6.0
注:入力は浮動である必要があります。
整数が必要な場合は、呼び出しint
て変換します。
>>> int(math.ceil(5.4))
6
ところで、使用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)
構文は、Pythonicのようではないかもしれませんが、強力なライブラリです。
https://docs.python.org/2/library/decimal.html
from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
誰も提案していないことに驚いています
(numerator + denominator - 1) // denominator
切り上げによる整数除算。以前はC / C ++ / CUDAの一般的な方法でした(cf. divup
)
1
それを減算する代わりに加算するか、計算を実行する前に分子と分母の両方の符号を反転する必要があります。
これを試して:
a = 211.0
print(int(a) + ((int(a) - a) != 0))
((int(a) - a) != 0)
式は、切り上げが必要な1
ときにいつでも返さa
れます。答えを広げて、これがどのように機能するかを説明することもできます。
>>> def roundup(number):
... return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
この関数はモジュールを必要としません。
3
、それはに切り上げでしょう4
か誰かが何を望んであってもなくてもよい
上記の答えは正しいですが、math
この1つの関数だけのためにモジュールをインポートすることは、通常、私には少しやり過ぎのように感じられます。幸いなことに、それを行う別の方法があります。
g = 7/5
g = int(g) + (not g.is_integer())
True
そして、False
として解釈される1
と0
pythonで数字を含む文で。g.is_interger()
基本的にg.has_no_decimal()
またはに変換されg == int(g)
ます。したがって、英語の最後のステートメントは次のようになりますround g down and add one if g has decimal
。
int(g) + (g % 1 > 0)
from math import ceil
数学モジュール全体のインポートを修正しているようです:)
import math
裏で何が起きているかという点では、ラインはそれほど変わらないと思います。を除くすべてのシンボルを削除しますceil
。
まだこの答えを見ていなかったので驚いた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
しますが、そうなることはほとんどありません。
math.ceil()
?
Without importing I use:
ます。x + 0.4999
がに等しい場合は失敗することも述べました[n].5000
。
math
モジュールやmath.ceil()
余分なものをインストールすることなく、すべての実用的な目的のためにどこでも、標準ライブラリで提供されていますので。そして、いつ失敗するかについてのあなたの言及に関して、これはあなたの答えでは不完全です、それはそれが単一の点だけでなく、全体の間隔で失敗するからです。技術的には、iffであるかどうかにかかわらず、正しいと主張することはできますが、カジュアルな読者には、実際よりも可能性が低いという印象を与えます。
私はこれがかなり昔からあることを知っていますが、私はかなり興味深い答えを見つけたので、ここに行きます:
-round(-x-0.5)
これは端のケースを修正し、正と負の両方の数で機能し、関数のインポートを必要としません
乾杯
-round(-x-0.3) = x
pythonで4500/1000を操作すると、結果は4になります。これは、デフォルトのpythonは整数として結果を仮定するため、論理的には4500/1000 = 4.5-> int(4.5)= 4であり、ceil of 4は明らかに4です。
4500 / 1000.0を使用すると、結果は4.5となり、ceilは4.5-> 5になります。
javascriptを使用すると、4500/1000の結果として4.5を受け取ります。これは、javascriptが結果のみを「数値タイプ」と想定し、結果を直接floatとして返すためです。
幸運を!!
/
浮動小数点数になるため4500/1000
、常に4.5になります。
何もインポートしたくない場合は、いつでも次のように独自の単純な関数を作成できます。
def RoundUP(num):
if num== int(num):
return num
return int(num + 1)
フロア分割を使用して、1を追加できます。2.3 // 2 + 1
ceil()
、奇妙に反対のことをして代償する代わりに使用する
from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
私は基本的にPythonの初心者ですが、切り捨てるのではなく切り上げようとしているのであれば、どうしてですか:
round(integer) + 1
round(integer + 0.5)
。これは私が頻繁に何をすべきかです
round(number + .5)
数値が整数の場合は機能しません。round(3+.5) == 4
、あなたが実際に欲しいとき3
。