La division entière par rapport au quotient parqueté: pourquoi ce résultat surprenant?
-
19-09-2019 - |
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?
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.