2009-09-19 15 views
12

Po prostu próbuję uzyskać procent.Ruby odmawia prawidłowego podziału

irb(main):001:0> (25/50) * 100 
=> 0 

To powinno być zdecydowanie równe 50, co potwierdza mój kalkulator (skopiowane i wklejone to samo równanie do gcalc). Dlaczego Ruby nie chce tego zrobić?

+11

przy okazji , jeśli podział został rzeczywiście złamany w Ruby, czy naprawdę uważasz, że byłbyś pierwszą osobą, która to zauważy? Zawsze zdumiewa mnie, jak ludzie widzą nieoczekiwane zachowanie i zawsze zakładają, że jest to wina języka, biblioteki, środowiska itp., A nigdy z winy własnego kodu ... –

+0

@Daniel: Nie tylko Ruby, jakikolwiek język ... – gbn

+0

Większość języków działa w ten sposób, javascript jest godnym uwagi wyjątkiem. W rzeczywistości Ruby jest ekstra cool, automatycznie przesuwając się z Fixnum do Bignum, kiedy potrzebujesz więcej precyzji. (BTW, kto inny to robi?) Musi być jakiś język, który to robi ...) – DigitalRoss

Odpowiedz

28

Robi podział na liczby całkowite.

Zasadniczo 25 jest liczbą całkowitą (liczbą całkowitą), a więc jest 50, więc gdy dzieli się jeden od drugiego, daje inną liczbę całkowitą.

25/50 * 100 = 0.5 * 100 = 0 * 100 = 0 

Lepszym sposobem na zrobienie tego jest najpierw pomnożenie, a następnie podzielenie.

25 * 100/50 = 2500/50 = 50 

Można również użyć arytmetyki zmiennoprzecinkowej wyraźnie określając dziesiętny jak w:

25.0/50.0 * 100 = 0.5 * 100 = 50 
+1

Dzięki chłopaki! Obliczałem procent ukończenia otwierania pliku w open-uri. Oto, czego użyłem: percent = (file_downloaded.to_f/file_length.to_f) * 100 – RyanScottLewis

+0

Użyj wtedy drugiego formularza. To łatwiejsze niż próby konwersji na liczby zmiennoprzecinkowe. –

+0

A raczej pierwsze rozwiązanie. Pomnóż następnie podziel jeden. Wiesz co mam na myśli. –

9

bo jesteś dzieląc liczbę całkowitą przez liczbę całkowitą, więc wynik jest uzyskiwanie obcięta do liczby całkowitej (0,5 -> 0), zanim się pomnożyć przez 100.

Ale to działa:

>> (25/50) * 100 
=> 0 
>> (25.0/50) * 100 
=> 50.0 
+0

To jest świetne wytłumaczenie. Innymi słowy, jeśli ODPOWIEDŹ na twoje obliczenia jest MNIEJ, to 1 ... Ruby sprawi, że będzie 0. – FlyingV