¿Cómo redondeas un flotador a dos decimales en jruby?


172

JRuby 1.6.x. ¿Cómo redondeas un flotador a lugares decimales en jruby?

number = 1.1164
number.round(2)

The above shows the following error
wrong number of arguments (1 for 0)

¿Cómo redondeo esto a 2 decimales?

Respuestas:


87

Float # round puede tomar un parámetro en Ruby 1.9, no en Ruby 1.8. El valor predeterminado de JRuby es 1.8, pero es capaz de ejecutarse en modo 1.9 .


1
Sé que no parece ser la intención de Sam redondear el número con el fin de presentar algo como una moneda, pero tenga en cuenta que el uso de #round (precisión) no funcionará según lo previsto si está tratando de hacer esto (3 .round (2) # => 3.0, no 3.00). Para obtener esto, mira la respuesta de Theo a continuación.
jaredsmith

290
(5.65235534).round(2)
#=> 5.65

12
(5.6).round(2)solo regresa 5.6
Bala Karthik

3
parece razonable, ese marcador de posición cero adicional todavía está allí, simplemente no es visible
boulder_ruby

@BalaKarthik Esa es la razón por la que estoy usando la solución de Theo. Se redondea correctamente (excepto si va más allá de 3 decimales por alguna razón extraña, vea los comentarios), por lo que es la mejor solución si está buscando una salida de cadena.
Dylan Vander Berg

esto es correcto. Generaba latitud y longitud al azar, así que uso number.round (6) para 6 dígitos
gsumk

199

sprintf('%.2f', number)Es una forma críptica pero muy poderosa de formatear números. El resultado siempre es una cadena, pero dado que está redondeando, supongo que lo está haciendo para fines de presentación de todos modos. sprintfpuede formatear cualquier número de la forma que desee y mucho más.

Documentación completa de sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numberTambién funciona más comúnmente visto, al menos en mi experiencia.
Michael Kohl

66
@MichaelKohl La guía de estilo rubí favorece sprintf(o format) sobre la %versión. Aquí se discute algún razonamiento para eso , se trata principalmente de legibilidad. No es que todos tengamos que seguir la guía de estilo, solo dando algunas razones :)
Lucy Bain

3
tenga en cuenta que después del tercer decimal, sprintf se redondea hacia arriba en 6, no en 5, por ejemplo, sprintf ("%. 3f", 1.2225) será "1.222", sprintf ("%. 3f", 1.2226) será "1.223 ", si eso es importante para usted, utilice #round
ecoding5

Pero se 0.566666666666666redondea a0.57
Anwar

"%.2f"redondea 5hacia abajo, en lugar de hacia arriba, ¿hay alguna manera de arreglar eso?
Mirror318

3

Editar

Después de recibir comentarios, parece que la solución original no funcionó. Es por eso que actualizó la respuesta como una de las sugerencias.

def float_of_2_decimal(float_n) 
  float_n.to_d.round(2, :truncate).to_f
end

Otras respuestas pueden funcionar, si desea tener números redondeados de 2 decimales. Pero, si desea tener números de coma flotante con los dos primeros lugares decimales sin redondear , esas respuestas no ayudarán.

Entonces, para obtener un número de coma flotante con los dos primeros lugares decimales, utilicé esta técnica. No funciona en algunos casos

def float_of_2_decimal(float_n)
  float_n.round(3).to_s[0..3].to_f
end

con 5.666666666666666666666666, regresará en 5.66lugar de redondeado 5.67. Espero que ayude a alguien


1
Esto no funciona Para que funcione, debe tener en cuenta cualquier número de tamaño. Usando el patrón implementado aquí puedes: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end O mucho más simple que puedes usarfloat_n.to_d.round(2, :truncate).to_f
rorykoehler

Cualquier cosa con un int mayor que 9 antes del lugar decimal
rorykoehler

Gracias por el punto Pero, ¡tus métodos sugeridos también fallan en números grandes!
Anwar

Como 11111111111111111.222222222222222entrada, el primero muestra 1.11y el segundo muestra1.11111111111111e+16
Anwar

1
Sí, tienes razón ... una vez 16 lugares al frente o más. Problema de desbordamiento. Es mejor mantener un decimal grande si trabaja con números grandes. El encasillamiento presenta un problema
rorykoehler

-5

Prueba esto:

module Util
module MyUtil



    def self.redondear_up(suma,cantidad, decimales=0)

        unless suma.present?
            return nil
        end


        if suma>0
            resultado= (suma.to_f/cantidad)
            return resultado.round(decimales)
        end


        return nil


    end

end 
end 

3
Gracias por responder. ¿Podría revisarlo para que esté en inglés, ya que la pregunta se hizo en inglés?
Jared

¿Puedes traducir tu respuesta a inglés? Preguntas y respuestas en español deben existir aqui .
intcreator

-15

para truncar un decimal, he usado el siguiente código:

<th><%#= sprintf("%0.01f",prom/total) %><!--1dec,aprox-->
    <% if prom == 0 or total == 0 %>
        N.E.
    <% else %>
        <%= Integer((prom/total).to_d*10)*0.1 %><!--1decimal,truncado-->
    <% end %>
        <%#= prom/total %>
</th>

Si desea truncar a 2 decimales, debe usar Integr(a*100)*0.01


55
Nadie debería hacer esto NUNCA al emitir porcentajes. Esta es una forma realmente mala porque al truncar pierdes la capacidad de REDONDEAR correctamente a las 2 posiciones decimales más cercanas. es decir, 0.455 si solo trunca obtienes 0.45, lo cual es incorrecto para el redondeo porque debería resultar en 0.46. Nunca trunca un decimal, siempre redondea el número; de lo contrario, el resultado será incorrecto cuando el redondeo debe ocurrir.
El Gugaru
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.