Liczby zmiennoprzecinkowe nie mogą dokładnie reprezentować większości liczb dziesiętnych, więc po wpisaniu literału zmiennoprzecinkowego faktycznie otrzymujesz przybliżenie tego literału. Przybliżenie może być większe lub mniejsze niż wpisana liczba.
Możesz zobaczyć dokładną wartość liczby zmiennoprzecinkowej, rzutując ją na Dziesiętny lub Ułamek.
>>> from decimal import Decimal
>>> Decimal(0.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
>>> from fractions import Fractio
>>> Fraction(0.01)
Fraction(5764607523034235, 576460752303423488)
Możemy użyć typu Frakcja, aby znaleźć błąd spowodowany przez nasz niedokładny literał.
>>> float((Fraction(1)/Fraction(0.01)) - 100)
-2.0816681711721685e-15
Możemy również dowiedzieć się, jak szczegółowe są liczby zmiennoprzecinkowe o podwójnej precyzji o wartości około 100, używając nextafter z numpy.
>>> from numpy import nextafter
>>> nextafter(100,0)-100
-1.4210854715202004e-14
Na podstawie tego możemy przypuszczać, że najbliższa liczba zmiennoprzecinkowa 1/0.01000000000000000020816681711721685132943093776702880859375 to w rzeczywistości dokładnie 100.
Różnica między 1//0.01iint(1/0.01) jest zaokrąglenie. 1 // 0,01 zaokrągla dokładny wynik w dół do następnej liczby całkowitej w jednym kroku. Otrzymujemy wynik 99.
int (1 / 0,01) z drugiej strony zaokrągla w dwóch etapach, najpierw zaokrągla wynik do najbliższej liczby zmiennoprzecinkowej podwójnej precyzji (czyli dokładnie 100), a następnie zaokrągla tę liczbę zmiennoprzecinkową w dół do następnej liczby całkowitej (która jest ponownie dokładnie 100).