2012-06-25 14 views
5

Actualmente estoy tratando de dividir counts["email"] un hash que contiene el número 82,000 por una variable total que contiene el valor de 1,3 millones.¿Por qué no puedo dividir un fixnum por otro fixnum?

Cuando corro puts counts["email"]/total consigo 0.

Por qué no puedo realizar la división de estos?

+1

Si ambos operandos son enteros, Ruby realiza la división de enteros: http://mathworld.wolfram.com/IntegerDivision.html –

Respuesta

7

Porque así es como funciona Ruby: cuando se divide un número entero, se obtiene un número entero. En este caso, será 0, porque es la parte entera del resultado.

Para obtener el resultado del flotador, ¡simplemente dígale a Ruby que realmente necesita un flotador! Hay muchas maneras de hacerlo, creo que el más simple sería convertir sólo uno del operando en Float ...

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

No solo Ruby, ¡este es el comportamiento de la mayoría de los lenguajes de programación! Convertir el denominador en un flotador no es la única forma de resolver esto tampoco. Si se desea precisión matemática, 'Rational (cuentas [" email "], total)' sería superior. Tenga en cuenta que 'Rational' está en la biblioteca estándar en versiones anteriores a 1.9. – Max

+0

Supongo que el punto discutible es si el lenguaje está escrito de forma dinámica o estática. Perl, JavaScript y PHP (los idiomas con los que trabajé más) imprimirían aquí el valor flotante, aunque este último tenga el tipo "Flotante". – raina77ow

+1

Ruby y Python 2.7 (no Python 3) son lenguajes tipados dinámicamente donde la división entera da como resultado el cociente entero en lugar de un flotante. – Max

0

Debe usar flotantes para obtener el resultado "completo".

counts["email"]/total.to_f 
9

va a realizar la división, aunque no la que esperaba. Hay muchas maneras diferentes de dividir enteros en Ruby:

# Integer division: 
5/4  # => 1 

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

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

También puede convertir uno de sus números enteros a un Float o una Rational:

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

Tenga en cuenta que primero llamar fdiv es directamente faster que llamar to_f y luego usando el operador /. También deja en claro que está utilizando la división de punto flotante.

+0

Un comentario para el -1 sería apreciado. –

Cuestiones relacionadas