Question

L'opérateur // "division entière" de Python m'a surpris, aujourd'hui:

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0

Le documentation lit « (parqueté) quotient de x et y ». Alors, pourquoi est-Math.floor (11 / 1,1) égale à 10, mais 11 // 1,1 égal à 9?

Était-ce utile?

La solution

Parce que 1.1 ne peut pas être représenté sous forme binaire exactement; l'approximation est un Littler supérieur à 1,1 - Par conséquent, le résultat de la division est un peu trop petit.

Effectuez les opérations suivantes:

Sous python 2, le type à la console:

>>> 1.1
1.1000000000000001

En Python 3.1, la console affiche 1.1, mais en interne, il est toujours le même nombre.

>>> 11/1.1
10.0

Comme gnibbler souligne, cela est le résultat de « arrondi interne » dans les limites de précision disponibles de flotteurs. Et comme le MYYN souligne dans son commentaire, // utilise un algorithme différent pour calculer le résultat de la division de plancher que math.floor() afin de préserver a == (a//b)*b + a%b aussi bien que possible.

Utilisez le type de Decimal si vous avez besoin de cette précision.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top