Wie rundet man einen Float in jruby auf zwei Dezimalstellen?


171

JRuby 1.6.x. Wie rundet man einen Float in jruby auf Dezimalstellen?

number = 1.1164
number.round(2)

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

Wie runde ich das auf 2 Dezimalstellen?

Antworten:


87

Float # round kann einen Parameter in Ruby 1.9 annehmen, nicht in Ruby 1.8. JRuby ist standardmäßig 1.8, kann jedoch im 1.9-Modus ausgeführt werden .


1
Ich weiß, dass es nicht die Absicht von Sam zu sein scheint, die Zahl zu runden, um so etwas wie eine Währung darzustellen, aber seien Sie sich bewusst, dass die Verwendung von #round (Präzision) nicht wie beabsichtigt funktioniert, wenn Sie dies versuchen (3) .round (2) # => 3.0, nicht 3.00). Um dies zu erhalten, lesen Sie die Antwort von Theo unten.
Jarmsmith

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

12
(5.6).round(2)kehrt nur 5.6
Bala Karthik

3
scheint vernünftig, dass ein zusätzlicher Null-Platzhalter immer noch vorhanden ist, er ist einfach nicht sichtbar
boulder_ruby

@BalaKarthik Genau aus diesem Grund verwende ich die Lösung von Theo. Es rundet korrekt (außer wenn Sie aus irgendeinem Grund 3 Dezimalstellen überschreiten, siehe Kommentare). Dies ist also die bessere Lösung, wenn Sie nach einer Zeichenfolgenausgabe suchen.
Dylan Vander Berg

Dies ist richtig. Ich habe zufällige Breiten- und Längengrade generiert, daher verwende ich number.round (6) für 6 Ziffern
gsumk

198

sprintf('%.2f', number)ist eine kryptische, aber sehr leistungsfähige Methode zum Formatieren von Zahlen. Das Ergebnis ist immer eine Zeichenfolge, aber da Sie runden, gehe ich davon aus, dass Sie dies trotzdem zu Präsentationszwecken tun. sprintfkann jede Zahl fast beliebig formatieren und vieles mehr.

Vollständige Sprintf-Dokumentation: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numberAuch Arbeiten sind häufiger zu sehen, zumindest nach meiner Erfahrung.
Michael Kohl

6
@MichaelKohl Der Ruby Style Guide bevorzugt sprintf(oder format) die %Version. Einige Gründe dafür werden hier diskutiert , es geht hauptsächlich um Lesbarkeit. Nicht, dass wir alle dem Styleguide folgen müssen, nur um einige Gründe zu nennen :)
Lucy Bain

3
Beachten Sie, dass Sprintf nach der 3. Dezimalstelle auf 6 und nicht auf 5 aufgerundet wird. Sprintf ("%. 3f", 1.2225) ist beispielsweise "1.222", Sprintf ("%. 3f", 1.2226) ist "1.223" ", wenn das für Sie wichtig ist, bleiben Sie bei der Verwendung von #round
ecoding5

Aber 0.566666666666666Runden zu0.57
Anwar

"%.2f"Runden 5statt nach oben nach unten, ist es eine Möglichkeit , das zu beheben?
Mirror318

3

Bearbeiten

Nachdem Sie Feedback erhalten haben, scheint die ursprüngliche Lösung nicht funktioniert zu haben. Deshalb wurde die Antwort als einer der Vorschläge aktualisiert.

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

Andere Antworten können funktionieren, wenn Sie gerundete Zahlen mit 2 Dezimalstellen haben möchten. Wenn Sie jedoch Gleitkommazahlen mit den ersten beiden Dezimalstellen ohne Rundung haben möchten, helfen diese Antworten nicht weiter.

Um eine Gleitkommazahl mit den ersten beiden Dezimalstellen zu erhalten, habe ich diese Technik verwendet. Funktioniert in einigen Fällen nicht

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

mit 5.666666666666666666666666wird es zurückgegeben 5.66anstatt gerundet 5.67. Hoffe es wird jemandem helfen


1
Das funktioniert nicht. Damit es funktioniert, müssen Sie eine beliebige Größenzahl berücksichtigen. Mit dem hier implementierten Muster können Sie: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Oder viel einfacher können Sie verwendenfloat_n.to_d.round(2, :truncate).to_f
Rorykoehler

Alles mit einem int größer als 9 vor der Dezimalstelle
rorykoehler

Vielen Dank für den Punkt. Aber Ihre vorgeschlagenen Methoden scheitern auch bei großen Zahlen!
Anwar

Für 11111111111111111.222222222222222als Eingabe, erste Shows 1.11und zweiten Shows1.11111111111111e+16
Anwar

1
Ja, Sie haben Recht ... einmal 16 Plätze vor oder über. Überlaufproblem. Halten Sie sich am besten an eine große Dezimalstelle, wenn Sie mit großen Zahlen arbeiten. Typecasting führt Problem
rorykoehler

-5

Versuche dies:

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
Danke für die Antwort. Könnten Sie es bitte so überarbeiten, dass es auf Englisch ist, da die Frage auf Englisch gestellt wurde.
Jared

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

-15

Um eine Dezimalstelle abzuschneiden, habe ich den folgenden Code verwendet:

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

Wenn Sie auf 2 Dezimalstellen kürzen möchten, sollten Sie verwenden Integr(a*100)*0.01


5
Niemand sollte dies jemals tun, wenn er Prozentsätze wirft. Dies ist eine wirklich schlechte Form, da Sie durch Abschneiden die Fähigkeit verlieren, richtig auf die nächsten 2 Dezimalstellen zu runden. dh 0,455, wenn Sie nur abschneiden, erhalten Sie 0,45, was für die Rundung falsch ist, da dies zu 0,46 führen sollte. Schneiden Sie niemals eine Dezimalstelle immer um die Zahl ab, sonst ist das Ergebnis falsch, wenn die Aufrundung erfolgen muss.
Der Gugaru
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.