2012-06-25 11 views
5

Attualmente sto cercando di dividere counts["email"] un hash che contiene il numero di 82.000 da una variabile total che contiene il valore di 1,3 milioni.Perché non riesco a dividere un fixnum con un altro fixnum?

Quando eseguo puts counts["email"]/total ottengo 0.

Perché non è possibile eseguire la divisione su questi?

+1

Se entrambi gli operandi sono numeri interi, Ruby esegue la divisione intera: http://mathworld.wolfram.com/IntegerDivision.html –

risposta

7

Perché è così che funziona Rubino: quando si divide integer a intero, si ottiene un numero intero. In questo caso sarà 0, perché è la parte intera del risultato.

per ottenere il risultato galleggiante, basta dire di Ruby che in realtà bisogno di un galleggiante! Ci sono molti modi per farlo, credo che la più semplice sarebbe solo convertire uno degli operandi per Float ...

puts counts["email"]/total.to_f 
+3

Non solo Ruby, questo è il comportamento della maggior parte dei linguaggi di programmazione! Convertire il denominatore in un float non è l'unico modo per risolvere questo problema. Se si desidera la precisione matematica, 'Rational (conteggi [" email "], totale)' sarebbe superiore. Si noti che 'Rational' si trova nella libreria standard nelle versioni precedenti alla 1.9. – Max

+0

Immagino che il punto controverso sia se la lingua è tipizzata in modo dinamico o statico. Perl, JavaScript e PHP (le lingue con cui ho lavorato di più) stamperebbero qui il valore float, anche se quest'ultimo ha il tipo 'Float'. – raina77ow

+1

Ruby e Python 2.7 (non Python 3) sono lingue tipizzate dinamicamente in cui la divisione intera risulta nel quoziente intero anziché in virgola mobile. – Max

0

è necessario utilizzare galleggianti al fine di ottenere il risultato "pieno".

counts["email"]/total.to_f 
9

si sta eseguendo la divisione, anche se non quello che vi aspettavate. Ci sono molti modi diversi per dividere interi in Ruby:

# Integer division: 
5/4  # => 1 

# Floating point division: 
5.fdiv(4) # => 1.25 

# Rational division: 
5.quo(4) # => Rational(5, 4) 

È inoltre possibile convertire uno dei tuoi numeri interi ad un Float o un Rational:

5.to_f/4 # => 1.25 
5.to_r/4 # => Rational(5, 4) 

Si noti che prima di chiamare fdiv è direttamente faster che chiamare to_f e quindi utilizzando l'operatore /. Rende anche chiaro che stai usando la divisione in virgola mobile.

+0

Un commento per il -1 sarebbe apprezzato. –