Come arrotondare un float a due cifre decimali in jruby


172

JRuby 1.6.x. Come arrotondare un float alle cifre decimali in jruby.

number = 1.1164
number.round(2)

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

Come posso arrotondare questo a 2 decimali?

Risposte:


87

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 .


1
So che non sembra essere l'intenzione di Sam di arrotondare il numero allo scopo di presentare qualcosa come una valuta, ma sii consapevole che l'utilizzo di #round (precisione) non funzionerà come previsto se stai provando a farlo (3 .round (2) # => 3.0, non 3.00). Per ottenere questo, controlla la risposta di Theo di seguito.
Jaredsmith,

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

12
(5.6).round(2)sta tornando solo 5,6
Bala Karthik il

3
sembra ragionevole, quel segnaposto zero extra è ancora lì, non è appena visibile
boulder_ruby

@BalaKarthik Questo è il motivo per cui sto usando la soluzione di Theo. Arrotonda correttamente (tranne se si superano i 3 decimali per qualche strano motivo, vedere i commenti), quindi questa è la soluzione migliore se si sta cercando un output di stringa.
Dylan Vander Berg,

è giusto. Stavo generando latitudine e longitudine casuali, quindi uso number.round (6) per 6 cifre
gsumk,

199

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. sprintfpuoi 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


79
'%.2f' % numberfunziona anche più comunemente, almeno nella mia esperienza.
Michael Kohl,

6
@MichaelKohl La guida allo stile ruby favorisce 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 :)
Lucy Bain,

3
si noti che dopo il terzo decimale, lo sprintf arrotonda per eccesso a 6, non a 5, ad esempio sprintf ("%. 3f", 1.2225) sarà "1.222", sprintf ("%. 3f", 1.2226) sarà "1.223 ", se questo è importante per te, continua a utilizzare #round
ecoding5 il

Ma 0.566666666666666giri per0.57
Anwar

"%.2f"arrotondando 5per difetto , anziché per eccesso, esiste un modo per risolvere il problema?
Mirror318

3

modificare

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.66anziché arrotondato 5.67. Spero che possa aiutare qualcuno


1
Questo non funziona Per farlo funzionare devi tenere conto di qualsiasi numero di dimensione. Utilizzando il modello implementato qui puoi: 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
rorykoehler

Qualsiasi cosa con un int maggiore di 9 prima del decimale
rorykoehler

Grazie per il punto. Ma i tuoi metodi suggeriti falliscono anche su grandi numeri!
Anwar,

Per 11111111111111111.222222222222222come input, primo mostra 1.11e seconda mostra1.11111111111111e+16
Anwar

1
Sì, hai ragione ... una volta 16 posti davanti o sopra. Problema di overflow. È meglio attenersi al grande decimale se si lavora con numeri grandi. La tipografia introduce un problema
rorykoehler

-5

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 

3
Grazie per aver risposto. La prego di rivederlo in inglese, poiché la domanda è stata posta in inglese.
Jared,

Pu trad tradirir tu respuesta a inglés? Preguntas y respuestas en español deben esisteir aqui .
Intcreatore

-15

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


5
Nessuno dovrebbe farlo MAI quando si lanciano percentuali. Questa è davvero una cattiva forma perché troncando perdi la capacità di ROUND correttamente con le 2 posizioni decimali più vicine. vale a dire 0,455 se si tronca semplicemente si ottiene 0,45 che è errato per l'arrotondamento perché dovrebbe risultare in 0,46. Non troncare mai un decimale arrotondando sempre il numero altrimenti il ​​risultato sarà errato quando deve essere arrotondato per eccesso.
The Gugaru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.