Wynika to z okazji floating point numbers are represented. Nie jest prawdą, że 1.0
jest dokładnie 100 razy 0.01
(o ile punkty zmiennoprzecinkowe są reprezentowane wewnętrznie). Operator //
dokonuje podziału i podaje wyniki, więc wewnętrznie liczba ta jest nieco mniejsza niż 100.0
, co prowadzi do tego, że jest podlewany do 99.0
.
Ponadto Python 3.x używa a different approach do pokazywania liczby zmiennoprzecinkowej w porównaniu do Pythona 2.x. Oznacza to, że wynik 1.0/0.01
, choć nieco nieznacznie niższy niż 100.0
, zostanie wyświetlony jako 100.0
, ponieważ algorytm ustalił, że liczba jest wystarczająco zbliżona do 100.0
, aby można ją było uznać za równą 100.0
. Z tego powodu 1.0/0.01
jest wam pokazywany jako 100.0
, mimo że nie może on być reprezentowany wewnętrznie jako dokładnie ten numer.
Dzięki za szczegółową odpowiedź. Nawet jeśli logika jest jasna - to zachowanie wprowadza w błąd w tak intuicyjnej operacji. – Baba
@Baba: być może, ale jest to jedna z zastrzeżeń używania liczb zmiennoprzecinkowych. Liczba liczb zmiennoprzecinkowych jest o wiele większa, niż komputer mógłby mieć nadzieję na dokładne odwzorowanie, więc warto o tym wiedzieć, używając liczb zmiennoprzecinkowych. –