web-dev-qa-db-ja.com

負の整数除算の意外な結果

私のアプリケーションでは、次のことに遭遇し、その結果に驚きました。

8/-7=-2(両方の整数)。

これはどういう意味ですか?

44
Vivek S

実際の値、つまり8.0/(-7.0)の場合、結果はおおよそ_-1.143_になります。

整数除算を使用した結果は、_-2_のより負の値に切り捨てられます。 (これは「フロアディビジョン」とも呼ばれます)

このため、次のようなやや複雑な答えが得られます。

_>>> 8/(-7)
-2
>>> 8/7
1
_

注:これはPython 3で「修正」されており、8/(-7)の結果は_-1.143_。したがって、Python 2を使用する理由がない場合は、アップグレードする必要があります。 ;)

Python 3では、整数除算が必要な場合は、_//_演算子を使用できます。これにより、Pythonの8/(-7)と同じ答えが得られます。

これが件名のPython拡張提案です: PEP 238-除算演算子の変更

49
Chris Cooper

Pythonは常に、負の数の除算と正の数の除算の両方に対して「床の除算」を行います。

あれは

1/10 = 0
1/-10 = -1

しかし、時々私たちは1/-10を0にする必要があります

最初に浮動小数点除算を使用してから、結果をintにキャストすることで実行できることを理解しています。

int(float(1)/-10) = 0

それは私にとってはうまくいきます。将来のディビジョンをインポートしたり、Python 3にアップグレードしたりする必要はありません。

お役に立てれば幸いです〜

12
ZH.Jay

pythonで整数除算を浮動小数点に自動的に変換するには、次のように使用できます。

from __future__ import division

今:

8/-7=-1.1428571428571428

この機能は標準ではありませんpython 2整数除算に依存する既存のコードを壊さないために。ただし、これはpython 3.のデフォルトの動作です。

9
Andrea Zonca

除算時に両方の値が整数の場合Pythonは床除算を使用します。

4
Lossy

Pythonでは、/演算子は整数除算用です。フロート除算の後にfloor演算が続くものとして見ることができます。

例えば、

8/7 == floor(8.0/7.0)== 1

8/-7 == floor(8.0/-7.0)== -2

0