Risposte:
Float # round può accettare un parametro in Ruby 1.9, non in Ruby 1.8. Per impostazione predefinita, JRuby è 1.8, ma è in grado di funzionare in modalità 1.9 .
(5.65235534).round(2)
#=> 5.65
(5.6).round(2)
sta tornando solo 5,6
sprintf('%.2f', number)
è un modo criptico ma molto potente per formattare i numeri. Il risultato è sempre una stringa, ma dato che stai arrotondando suppongo che lo stai facendo comunque a scopo di presentazione. sprintf
puoi formattare qualsiasi numero quasi come preferisci e molto altro.
Documentazione completa sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf
'%.2f' % number
funziona anche più comunemente, almeno nella mia esperienza.
sprintf
(o format
) la %
versione. Alcuni ragionamenti per questo sono discussi qui , si tratta principalmente di leggibilità. Non che tutti dobbiamo seguire la guida di stile, solo per fornire alcuni motivi :)
0.566666666666666
giri per0.57
"%.2f"
arrotondando 5
per difetto , anziché per eccesso, esiste un modo per risolvere il problema?
Dopo aver ricevuto feedback, sembra che la soluzione originale non abbia funzionato. Ecco perché ho aggiornato la risposta come uno dei suggerimenti.
def float_of_2_decimal(float_n)
float_n.to_d.round(2, :truncate).to_f
end
Altre risposte potrebbero funzionare se si desidera avere numeri arrotondati di 2 cifre decimali. Ma, se vuoi avere numeri in virgola mobile con le prime due cifre decimali senza arrotondamento , Quelle risposte non ti aiuteranno.
Quindi, per ottenere un numero in virgola mobile con i primi due decimali, ho usato questa tecnica. In alcuni casi non funziona
def float_of_2_decimal(float_n)
float_n.round(3).to_s[0..3].to_f
end
con 5.666666666666666666666666
, verrà restituito 5.66
anziché arrotondato 5.67
. Spero che possa aiutare qualcuno
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 molto più semplice puoi usarefloat_n.to_d.round(2, :truncate).to_f
11111111111111111.222222222222222
come input, primo mostra 1.11
e seconda mostra1.11111111111111e+16
Prova questo:
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
per troncare un decimale ho usato il seguente codice:
<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 vuoi troncare a 2 decimali, dovresti usare Integr(a*100)*0.01