Respostas:
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 .
(5.65235534).round(2)
#=> 5.65
(5.6).round(2)está retornando apenas 5,6
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
'%.2f' % numbertambém funciona é mais comumente visto, pelo menos na minha experiência.
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 :)
0.566666666666666arredonda para0.57
"%.2f"Arredonda para 5baixo, em vez de para cima, existe alguma maneira de corrigir isso?
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
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
11111111111111111.222222222222222como entrada, primeiro mostra 1.11e segundo mostra1.11111111111111e+16
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
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