2015-06-14 14 views
7

Myślę, że istnieje pewne niespójności w operacji podziału, ale nie jestem pewien.Dziwne wyniki podziału w python 3

W następującym kodzie spodziewam się, że // c będzie równe 100.0 lub b // c będzie -99.0.

a = 1.0 
b = -1.0 
c = 0.01 

print (a/c) 
print (a//c) 
print (b/c) 
print (b//c) 

daje:

100.0 
99.0 
-100.0 
-100.0 

Dzięki

Odpowiedz

3

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.

+0

Dzięki za szczegółową odpowiedź. Nawet jeśli logika jest jasna - to zachowanie wprowadza w błąd w tak intuicyjnej operacji. – Baba

+0

@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. –