2009-09-19 14 views
12

Estoy tratando de obtener un porcentaje.Ruby se niega a dividirse correctamente

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

Esto debería definitivamente iguales 50, según lo confirmado por mi calculadora (copiar y pegar la misma ecuación en gcalc). ¿Por qué Ruby se niega a hacer esto?

+11

por cierto , si la división realmente se rompió en Ruby, ¿realmente crees que serías la primera persona en notarlo? Siempre me sorprende cómo las personas ven un comportamiento inesperado y siempre asumen que es culpa del lenguaje, la biblioteca, el entorno, etc., y nunca tienen la culpa de su propio código ... –

+0

@Daniel: No solo Ruby, cualquier idioma ... – gbn

+0

La mayoría de los lenguajes funcionan así, javascript es una excepción notable. En realidad, Ruby es muy cool, cambiando automáticamente de Fixnum a Bignum cuando necesitas más precisión. (Por cierto, ¿quién más hace eso? Debe haber algo de lang que lo haga ...) – DigitalRoss

Respuesta

28

Está haciendo una división entera.

Básicamente, 25 es un número entero (un número entero) y también 50, por lo que cuando se divide uno por el otro, se obtiene otro entero.

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

La mejor manera de hacerlo es multiplicar primero, luego dividir.

25 * 100/50 = 2500/50 = 50 

También puede utilizar la aritmética de punto flotante de forma explícita mediante la especificación de un punto decimal como en:

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

¡Gracias chicos! Estaba calculando el porcentaje completado de abrir un archivo en open-uri. Esto es lo que usé: percent = (file_downloaded.to_f/file_length.to_f) * 100 – RyanScottLewis

+0

Use la segunda forma a continuación. Es más fácil que tratar de convertir a números en coma flotante. –

+0

O más bien, la primera solución. El multiplicar luego divide uno. Sabes a lo que me refiero. –

9

Debido a que está dividiendo un número entero por un entero, por lo que el resultado quedan truncados a entero (0,5 -> 0) antes de ser multiplicado por 100.

Pero esto funciona:

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

Esta es una gran explicación. En otras palabras, si la RESPUESTA a su cálculo es MENOS entonces 1 ... Ruby lo hará 0. – FlyingV

Cuestiones relacionadas