Jak zaokrąglić pływak do dwóch miejsc po przecinku w jrubach

172

JRuby 1.6.x. Jak zaokrąglić pływak do miejsc dziesiętnych w jrubach.

number = 1.1164
number.round(2)

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

Jak zaokrąglić to do 2 miejsc po przecinku?

Sam
źródło

Odpowiedzi:

87

Okrągły float # może przyjąć parametr w Ruby 1.9, a nie w Ruby 1.8. JRuby domyślnie wynosi 1,8, ale może działać w trybie 1,9 .

steenslag
źródło
1
Wiem, że zamiarem Sama nie wydaje się być zaokrąglenie liczby w celu przedstawienia czegoś w rodzaju waluty, ale pamiętaj, że użycie #round (precyzja) nie będzie działać zgodnie z zamierzeniami, jeśli próbujesz to zrobić (3 .round (2) # => 3,0, a nie 3,00). Aby to uzyskać, zapoznaj się z odpowiedzią Theo poniżej.
jaredsmith
290
(5.65235534).round(2)
#=> 5.65
boulder_ruby
źródło
12
(5.6).round(2)wraca tylko 5,6
Bala Karthik
3
wydaje się rozsądne, że ten dodatkowy symbol zastępczy zera nadal istnieje, po prostu jest niewidoczny
boulder_ruby
@BalaKarthik To jest właśnie powód, dla którego używam rozwiązania Theo. Zaokrągla się poprawnie (z wyjątkiem sytuacji, gdy z jakiegoś dziwnego powodu przekraczasz 3 miejsca po przecinku, zobacz komentarze), więc jest to lepsze rozwiązanie, jeśli szukasz wyniku w postaci ciągu.
Dylan Vander Berg
to prawda. Generowałem losową szerokość i długość geograficzną, więc używam liczby.round (6) dla 6 cyfr
podsumowanie
199

sprintf('%.2f', number)to tajemniczy, ale bardzo skuteczny sposób formatowania liczb. Wynik jest zawsze ciągiem, ale ponieważ zaokrąglasz, zakładam, że i tak robisz to w celach prezentacyjnych. sprintfmożesz formatować dowolną liczbę prawie w dowolny sposób, i wiele więcej.

Pełna dokumentacja sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf

Theo
źródło
79
'%.2f' % numberrównież działa częściej, przynajmniej z mojego doświadczenia.
Michael Kohl
6
@MichaelKohl Przewodnik po stylu ruby faworyzuje sprintf(lub format) %wersję. Omówiono tutaj pewne powody , głównie dotyczące czytelności. Nie żebyśmy wszyscy musieli postępować zgodnie z przewodnikiem po stylu, podając tylko kilka powodów :)
Lucy Bain
3
pamiętaj, że po trzecim miejscu po przecinku sprintf zaokrągla w górę do 6, a nie do 5, na przykład sprintf („%. 3f”, 1,2225) wyniesie „1,222”, a sprintf („%. 3f”, 1,2226) wyniesie „1,223 ”, jeśli to dla Ciebie ważne, trzymaj się #round
ecoding5
Ale 0.566666666666666zaokrągla do0.57
Anwar
"%.2f"zaokrągla w 5dół zamiast w górę, czy jest jakiś sposób, aby to naprawić?
Mirror318
3

Edytować

Po otrzymaniu opinii wydaje się, że oryginalne rozwiązanie nie działa. Dlatego zaktualizowałem odpowiedź jako jedną z sugestii.

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

Inne odpowiedzi mogą działać, jeśli chcesz mieć zaokrąglone liczby do 2 miejsc po przecinku. Ale jeśli chcesz mieć liczby zmiennoprzecinkowe z pierwszymi dwoma miejscami po przecinku bez zaokrąglania , te odpowiedzi nie pomogą.

Tak więc, aby uzyskać liczbę zmiennoprzecinkową z pierwszymi dwoma miejscami po przecinku, użyłem tej techniki. W niektórych przypadkach nie działa

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

z 5.666666666666666666666666, zwróci 5.66zamiast zaokrąglenia 5.67. Mam nadzieję, że to komuś pomoże

Anwar
źródło
1
To nie działa. Aby to zadziałało musisz uwzględnić dowolny numer rozmiaru. Korzystając z zaimplementowanego tutaj wzoru możesz: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Lub znacznie prostszy możesz użyćfloat_n.to_d.round(2, :truncate).to_f
rorykoehler
Wszystko z liczbą int większą niż 9 przed miejscem dziesiętnym
rorykoehler
Dziękuję za uwagę. Ale twoje sugerowane metody zawodzą również w przypadku dużych liczb!
Anwar
Na 11111111111111111.222222222222222jako wejście, pierwszy ONE 1.11i druga pokazuje1.11111111111111e+16
Anwar
1
Tak, masz rację ... raz 16 miejsc przed lub powyżej. Problem z przepełnieniem. Jeśli pracujesz z dużymi liczbami, najlepiej trzymać się dużego miejsca dziesiętnego. Rzutowanie wprowadza problem
rorykoehler
-5

Spróbuj tego:

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
źródło
3
Dzięki za odpowiedź. Czy mógłbyś zmienić to tak, aby było w języku angielskim, ponieważ pytanie zostało zadane w języku angielskim.
Jared,
Puedes traducir tu respuesta a inglés? Preguntas y respuestas en español deben existir aqui .
intcreator
-15

aby obciąć ułamek dziesiętny, użyłem następującego kodu:

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

Jeśli chcesz skrócić do 2 miejsc po przecinku, użyj Integr(a*100)*0.01

Ivan Carrasco Quiroz
źródło
5
Nikt nie powinien tego NIGDY robić podczas rzucania procentów. To naprawdę zła forma, ponieważ obcięcie powoduje utratę możliwości prawidłowego ZAOKRĄGLENIA do najbliższych 2 miejsc po przecinku. tj. 0,455, jeśli po prostu skracasz, otrzymasz 0,45, co jest błędem przy zaokrąglaniu, ponieważ powinno dać wynik 0,46. Nigdy nie obcinaj ułamka dziesiętnego zawsze zaokrągla liczbę, w przeciwnym razie wynik będzie nieprawidłowy, gdy zaokrąglenie w górę musi nastąpić.
The Gugaru