2009-09-19 11 views
12

Sto semplicemente cercando di ottenere una percentuale.Ruby rifiuta di dividere correttamente

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

Questo dovrebbe sicuramente uguali 50, come confermato dalla mia calcolatrice (copiato e incollato la stessa equazione in gcalc). Perché Ruby si rifiuta di farlo?

+11

Tra l'altro , se la divisione fosse effettivamente rotta in Ruby, pensi davvero che saresti la prima persona a notarlo? Mi stupisce sempre il modo in cui le persone vedono un comportamento inaspettato e assumono sempre che sia colpa del linguaggio, della biblioteca, dell'ambiente, ecc., E mai colpa del proprio codice ... –

+0

@Daniel: Non solo Ruby, qualsiasi lingua ... – gbn

+0

La maggior parte delle lingue funziona così, javascript è un'eccezione degna di nota. In realtà Ruby è straordinariamente bello, passando automaticamente da Fixnum a Bignum quando hai bisogno di maggiore precisione. (A proposito, chi altro lo fa? Ci deve essere qualche lang che lo fa ...) – DigitalRoss

risposta

28

Sta facendo divisione integer.

Fondamentalmente, 25 è un numero intero (un numero intero) e quindi 50, quindi quando si divide l'uno con l'altro, si ottiene un altro numero intero.

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

Il modo migliore per farlo è innanzitutto moltiplicare, quindi dividere.

25 * 100/50 = 2500/50 = 50 

è anche possibile utilizzare aritmetica in virgola mobile in modo esplicito specificando un punto decimale come in:

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

Grazie ragazzi! Stavo calcolando la percentuale di apertura di un file in open-uri. Ecco cosa ho usato: percent = (file_downloaded.to_f/file_length.to_f) * 100 – RyanScottLewis

+0

Utilizza il secondo modulo quindi. È più facile che provare a convertire in numeri in virgola mobile. –

+0

O meglio, la prima soluzione. Il moltiplicare poi dividere uno. Sai cosa intendo. –

9

Perché si sta dividendo un numero intero da un numero intero, quindi il risultato è sempre troncato a numero intero (0.5 -> 0) prima di essere moltiplicato per 100.

Ma questo funziona:

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

Questa è una grande spiegazione. In altre parole se la RISPOSTA al tuo calcolo è MENO allora 1 ... Ruby lo farà 0. – FlyingV

Problemi correlati