Como arredondar um float para duas casas decimais em jruby

172

JRuby 1.6.x. Como arredondar um flutuador para casas decimais em jruby.

number = 1.1164
number.round(2)

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

Como arredondar para duas casas decimais?

Sam
fonte

Respostas:

87

Float # round pode usar um parâmetro no Ruby 1.9, não no Ruby 1.8. O JRuby assume como padrão 1,8, mas é capaz de executar no modo 1.9 .

steenslag
fonte
1
Sei que não parece ser a intenção de Sam arredondar o número com o objetivo de apresentar algo como uma moeda, mas esteja ciente de que o uso de #round (precision) não funcionará conforme o esperado, se você estiver tentando fazer isso (3). .round (2) # => 3.0, não 3.00). Para isso, confira a resposta de Theo abaixo.
jaredsmith
290
(5.65235534).round(2)
#=> 5.65
boulder_ruby
fonte
12
(5.6).round(2)está retornando apenas 5,6
Bala Karthik 12/07
3
parece razoável, esse extra de espaço reservado de zero ainda está lá, não apenas a sua visível
boulder_ruby
@BalaKarthik Essa é a verdadeira razão pela qual estou usando a solução da Theo. Arredonda corretamente (exceto se você estiver passando de três casas decimais por algum motivo estranho, consulte os comentários), de modo que essa é a melhor solução se você estiver procurando pela saída da string.
Dylan Vander Berg
isto está certo. Eu estava a geração aleatória de latitude e longitude então uso number.round (6) para 6 dígitos
gsumk
199

sprintf('%.2f', number)é uma maneira enigmática, mas muito poderosa, de formatar números. O resultado é sempre uma string, mas como você está arredondando, presumo que você esteja fazendo isso para fins de apresentação de qualquer maneira. sprintfpode formatar qualquer número da maneira que você quiser e muito mais.

Documentação completa do sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf

Theo
fonte
79
'%.2f' % numbertambém funciona é mais comumente visto, pelo menos na minha experiência.
Michael Kohl
6
@MichaelKohl O guia de estilo ruby favorece sprintf(ou format) a %versão. Alguns argumentos para isso são discutidos aqui , principalmente sobre legibilidade. Não que todos nós temos de seguir o guia de estilo, apenas dando algumas razões :)
Lucy Bain
3
observe que, após a terceira decimal, o sprintf arredondará para 6, e não para 5, por exemplo, o sprintf ("%. 3f", 1,2225) será "1,222", o sprintf ("%. 3f", 1,2226) será "1,222 ", se isso for importante para você, use #round
ecoding5 26/02
Mas 0.566666666666666arredonda para0.57
Anwar
"%.2f"Arredonda para 5baixo, em vez de para cima, existe alguma maneira de corrigir isso?
Mirror318
3

Editar

Depois de receber feedback, parece que a solução original não funcionou. Por isso, atualizou a resposta como uma das sugestões.

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

Outras respostas podem funcionar, se você quiser ter números arredondados de 2 casas decimais. Mas, se você quiser ter números de ponto flutuante com as duas primeiras casas decimais sem arredondamento , essas respostas não ajudarão.

Portanto, para obter um número de ponto flutuante com as duas primeiras casas decimais, usei essa técnica. Não funciona em alguns casos

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

com 5.666666666666666666666666, ele retornará em 5.66vez de arredondado 5.67. Espero que ajude alguém

Anwar
fonte
1
Isso não funciona. Para fazê-lo funcionar, é necessário considerar qualquer número de tamanho. Usando o padrão implementado aqui você pode: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Ou muito mais simples que você pode usarfloat_n.to_d.round(2, :truncate).to_f
rorykoehler
Qualquer coisa com um int maior do que 9 antes da casa decimal
rorykoehler
Obrigado pelo ponto. Mas, seus métodos sugeridos também falham em grandes números!
Anwar #
Por 11111111111111111.222222222222222como entrada, primeiro mostra 1.11e segundo mostra1.11111111111111e+16
Anwar
1
Sim, você está certo ... uma vez que 16 lugares na frente ou mais. Problema de estouro. É melhor ficar com um decimal grande se estiver trabalhando com números grandes. Typecasting introduz problema
rorykoehler
-5

Tente o seguinte:

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 
HalleyRios
fonte
3
Obrigado por responder. Você poderia revisá-lo em inglês, pois a pergunta foi feita em inglês.
Jared
Puedes traducir tu respuesta to inglés? Preguntas e respostas em espanhol que existem aqui .
Intcreator
-15

para truncar um decimal, usei o seguinte 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>

Se você deseja truncar até 2 casas decimais, use Integr(a*100)*0.01

Ivan Carrasco Quiroz
fonte
5
Ninguém deve fazer isso NUNCA ao converter porcentagens. Essa é uma forma muito ruim, porque ao truncar você perde a capacidade de ROUND corretamente até as 2 casas decimais mais próximas. ou seja, 0,455 se você apenas truncar, obtém 0,45, o que é errado no arredondamento, pois deve resultar em 0,46. Nunca truncar um decimal sempre arredonda o número, caso contrário o resultado estará errado quando o arredondamento for necessário.
The Gugaru 26/08/2015