Les nombres à virgule flottante ne peuvent pas représenter exactement la plupart des nombres décimaux, donc lorsque vous tapez un littéral à virgule flottante, vous obtenez en fait une approximation de ce littéral. L'approximation peut être plus grande ou plus petite que le nombre que vous avez tapé.
Vous pouvez voir la valeur exacte d'un nombre à virgule flottante en le convertissant en décimal ou en fraction.
>>> from decimal import Decimal
>>> Decimal(0.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
>>> from fractions import Fractio
>>> Fraction(0.01)
Fraction(5764607523034235, 576460752303423488)
Nous pouvons utiliser le type Fraction pour trouver l'erreur causée par notre littéral inexact.
>>> float((Fraction(1)/Fraction(0.01)) - 100)
-2.0816681711721685e-15
Nous pouvons également découvrir comment les nombres à virgule flottante double précision granulaires autour de 100 sont en utilisant nextafter de numpy.
>>> from numpy import nextafter
>>> nextafter(100,0)-100
-1.4210854715202004e-14
De cela, nous pouvons supposer que le nombre à virgule flottante le plus proche de 1/0.01000000000000000020816681711721685132943093776702880859375est en fait exactement 100.
La différence entre 1//0.01et int(1/0.01)est l'arrondi. 1 // 0,01 arrondit le résultat exact au nombre entier suivant en une seule étape. Nous obtenons donc un résultat de 99.
int (1 / 0,01), d'autre part, arrondit en deux étapes, d'abord il arrondit le résultat au nombre à virgule flottante double précision le plus proche (qui est exactement 100), puis il arrondit ce nombre à virgule flottante à l'entier suivant (qui est à nouveau exactement 100).