I numeri in virgola mobile non possono rappresentare esattamente la maggior parte dei numeri decimali, quindi quando si digita un letterale in virgola mobile si ottiene effettivamente un'approssimazione di quel letterale. L'approssimazione può essere maggiore o minore del numero digitato.
È possibile visualizzare il valore esatto di un numero in virgola mobile eseguendolo su Decimale o Frazione.
>>> from decimal import Decimal
>>> Decimal(0.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
>>> from fractions import Fractio
>>> Fraction(0.01)
Fraction(5764607523034235, 576460752303423488)
Possiamo usare il tipo di frazione per trovare l'errore causato dal nostro letterale inesatto.
>>> float((Fraction(1)/Fraction(0.01)) - 100)
-2.0816681711721685e-15
Possiamo anche scoprire come i numeri in virgola mobile a precisione doppia granulare intorno a 100 sono usando Nextafter di numpy.
>>> from numpy import nextafter
>>> nextafter(100,0)-100
-1.4210854715202004e-14
Da ciò possiamo ipotizzare che il numero in virgola mobile più vicino 1/0.01000000000000000020816681711721685132943093776702880859375sia in realtà esattamente 100.
La differenza tra 1//0.01e int(1/0.01)è l'arrotondamento. 1 // 0,01 arrotonda il risultato esatto al numero intero successivo in un solo passaggio. Quindi otteniamo un risultato di 99.
int (1 / 0.01) invece arrotonda in due fasi, prima arrotonda il risultato al numero in virgola mobile a precisione doppia più vicino (che è esattamente 100), quindi arrotonda il numero in virgola mobile al numero intero successivo (che è di nuovo esattamente 100).