2011-03-31 39 views
198

Por ejemplo:¿Por qué la división en Ruby devuelve un número entero en lugar de un valor decimal?

9/5 #=> 1 

pero esperaba 1.8. ¿Cómo puedo obtener el resultado correcto decimal (no entero)? ¿Por qué está regresando 1 en absoluto?

+4

Tenga en cuenta que si realmente está utilizando un método para devolver este valor, no necesita asignarlo a una variable; simplemente 'método def; a - b/8; end' devolvería el resultado del cálculo del método, ya que la última expresión en una llamada a método es el valor de retorno. – Phrogz

Respuesta

195

Está haciendo una división entera. Usted puede hacer uno de los números de un Float añadiendo .0:

9.0/5 #=> 1.8 
9/5.0 #=> 1.8 
+6

Esto funciona, pero la respuesta to_f a continuación parece más útil. ¿Es to_f más idiomático en Ruby? –

+3

La respuesta '.to_f' es mejor si está dividiendo dos variables que contienen enteros, p. Ej. 'a.to_f/b'. Si literalmente estás dividiendo dos enteros codificados (lo que probablemente sea extraño), usar '9.0/5' está bien. – jefflunt

10

Cambie el 5 al 5.0. Obtendrás una división entera.

293

Es hacer la división entera. Puede utilizar to_f de forzar las cosas en el modo de punto flotante:

9.to_f/5 #=> 1.8 
9/5.to_f #=> 1.8 

Esto también funciona si sus valores son variables en lugar de literales. La conversión de un valor a un flotante es suficiente para forzar la expresión completa a la aritmética de coma flotante.

+0

Esta es la respuesta más "rieles" que la respuesta aceptada. –

+0

@muistooshort: no puedo replicarlo, lo siento. Probablemente estaba haciendo algo mal. –

+3

@SeanRyan ¿Por qué específicamente Rails en lugar de Ruby en general? No veo por qué un desarrollador (de Ruby on) Rails haría esta cosa específica de manera diferente a un desarrollador general de Ruby.Tal vez estoy acabando con la semántica y la mayoría de las personas solo ven (Ruby en) Rails y Ruby en este tipo de casos. –

30

se puede comprobar con el IRB:

$ irb 
>> 2/3 
=> 0 
>> 2.to_f/3 
=> 0.666666666666667 
>> 2/3.to_f 
=> 0.666666666666667 
+7

Me encantan las respuestas de estilo IRB. Son mucho más informativos. – thekingoftruth

141

También existe el método Numeric#fdiv que se puede utilizar en su lugar:

9.fdiv(5) #=> 1.8 
+1

+1 Agradable. Un método poco conocido pero útil. –

+1

+1 Me gusta esta más ... no necesito poner .0 :) –

+0

Este es el método más rápido que probé, la única forma de obtener más rendimiento es dividir los operandos que son flotadores para empezar. Creé un generador de números primos en Ruby para aprender la sintaxis, ahora lo estoy optimizando para aprender qué funciona mejor. Aquí está el punto de referencia que arme: require 'base 64'; require 'zlib'; pone Zlib.inflate (Base64.decode64 ("eJxlkMEOwiAQRO98hekFuGzxQEwPXvwR01ZqiYHqBk2Tln8XDlWgnDbM25nJonq9NaoD7ZTtR9PigxK09zM7AkgRHieXTYHOsBNf1nklM6B6TuhYpdp + rPgSdiCOi/d/kQ71QBOtAVFLEDly05 + UYQ2H + + MckL6z0zioDdJG1S9K1K4iQAW66DhnmiqRYKEJFXMByux XuOJ2XdO60dKsjC7aBtyTL5O5hLk =")) –

22

Puede incluir el módulo de rubí mathn.

require 'mathn' 

De esta forma, podrás hacer la división normalmente.

1/2    #=> (1/2) 
(1/2) ** 3  #=> (1/8) 
1/3*3   #=> 1 
Math.sin(1/2) #=> 0.479425538604203 

De esta manera, se obtiene división exacta (clase Racional) hasta que decide aplicar una operación que no se puede expresar como ser racional, por ejemplo Math.sin.

2

Fixnum # to_r no se menciona aquí, se introdujo desde ruby ​​1.9. Convierte Fixnum en forma racional. A continuación hay ejemplos de sus usos. Esto también puede dar una división exacta siempre que todos los números utilizados sean Fixnum.

a = 1.to_r #=> (1/1) 
a = 10.to_r #=> (10/1) 
a = a/3 #=> (10/3) 
a = a * 3 #=> (10/1) 
a.to_f  #=> 10.0 

Ejemplo donde un flotador operado en un número racional encubra el resultado para flotar.

a = 5.to_r #=> (5/1) 
a = a * 5.0 #=> 25.0 
Cuestiones relacionadas