誰かがこれを説明できますか( docs -強調鉱山からまっすぐ):
math.ceil(x)xの上限を返しますフロートとして、最小の整数 x以上の値。
math.floor(x)xのフロアを返しますフロートとして、最大の整数 x以下の値。
.ceil
と.floor
が整数を計算すると想定されているのに、なぜfloatを返すのですか?
編集:
さて、これはなぜshould floatを返すのかという非常に良い議論を持ち、 @ jcollado が実際に- do Python 3でintを返します...
通常、浮動小数点数の範囲は整数の範囲を超えています。浮動小数点値を返すことにより、関数は、表現可能な整数の範囲外にある入力値に対して適切な値を返すことができます。
考慮:floor()
が整数を返した場合、floor(1.0e30)
は何を返す必要がありますか?
現在、Pythonの整数は任意の精度になっていますが、常にこのようになっているわけではありません。標準ライブラリ関数は、同等のCライブラリ関数の薄いラッパーです。
他の回答で指摘されているように、pythonでフロートを返すのは、おそらくオーバーフローの問題を防ぐための歴史的な理由によるものです。ただし、python 3で整数を返します。
>>> import math
>>> type(math.floor(3.1))
<class 'int'>
>>> type(math.ceil(3.1))
<class 'int'>
詳細については、 PEP 3141 をご覧ください。
Pythonの数学ライブラリは、浮動小数点数を返すC数学ライブラリの薄いラッパーであるためです。
あなたの混乱の原因はあなたのコメントで明白です:
Ceil/floor操作のポイントは、floatを整数に変換することです!
Ceilおよびfloor操作のポイントは、浮動小数点データを整数値に丸めることです。型変換を行わない。 integer値を取得する必要があるユーザーは、操作後に明示的な変換を行うことができます。
整数を返すceilまたはfloat演算のみが利用可能な場合、整数値への丸めを簡単に実装することはできないことに注意してください。入力が表現可能な整数範囲内にあることを最初に確認してから、関数を呼び出す必要があります。 NaNと無限大を別のコードパスで処理する必要があります。
さらに、 IEEE 754 に準拠したい場合は、浮動小数点数を返すバージョンのceilとfloorが必要です。
Python 2.4より前では、整数は切り捨てられた実数の全範囲を保持できませんでした。
http://docs.python.org/whatsnew/2.4.html#pep-237-unifying-long-integers-and-integers
Floatの範囲は整数の範囲よりも大きいため、整数を返すとオーバーフローする可能性があります
これは非常に興味深い質問です!浮動小数点数は指数(= bits_for_exponent
)を格納するためにいくつかのビットを必要とするため、2**(float_size - bits_for_exponent)
より大きい浮動小数点数は常に整数値になります!反対の極端な場合、負の指数を持つフロートは、1
、0
、または-1
のいずれかを返します。これにより、 整数範囲 対 フロート範囲 なぜなら、これらの関数は、数値が整数型の範囲外にあるときは常に元の数値を返すからです。 python関数はC
関数のラッパーであるため、これは実際にはC
関数の欠陥であり、整数を返し、プログラマに範囲/ NaN
/Inf
は、ceil/floorを呼び出す前に確認します。
したがって、論理的な答えは、これらの関数が有用であり、整数の範囲内の値を返す場合のみであるため、floatを返すのは 間違い そして、あなたはこれを実現するために非常に賢いです!
他の言語でも同様にこれが行われるため、一般に受け入れられている動作である可能性があります。 (他の回答に示されているように、正当な理由のため)