Bir şamandırayı jruby'de iki ondalık basamağa nasıl yuvarlarsınız


172

JRuby 1.6.x. Bir şamandırayı jüri içindeki ondalık basamaklara nasıl yuvarlarsınız.

number = 1.1164
number.round(2)

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

Bunu nasıl 2 ondalık basamağa yuvarlayabilirim?

Yanıtlar:


87

Float # round, Ruby 1.8'de değil Ruby 1.9'da bir parametre alabilir. JRuby varsayılan olarak 1.8'dir, ancak 1.9 modunda çalışabilir .


1
Sam'in bir para birimi gibi bir şey sunmak amacıyla sayıyı yuvarlama niyeti olmadığını biliyorum, ancak bunu yapmaya çalışıyorsanız #round (duyarlık) kullanmanın amaçlandığı gibi çalışmayacağını unutmayın (3 .round (2) # => 3.0, 3.00 değil). Bunu elde etmek için aşağıdaki Theo'nun cevabına göz atın.
jaredsmith

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

12
(5.6).round(2)sadece 5.6'ya dönüyor
Bala Karthik

3
makul görünüyor, ekstra sıfır yer tutucusu hala orada, sadece görünür değil
boulder_ruby

@BalaKarthik Theo'nun çözümünü kullanmamın nedeni budur. Doğru bir şekilde yuvarlar (garip bir nedenden ötürü 3 ondalık basamaktan geçiyorsanız, yorumlara bakın), bu nedenle dize çıktısı arıyorsanız daha iyi bir çözümdür.
Dylan Vander Berg

bu doğru. Rastgele enlem ve boylam ürettim, bu yüzden 6 basamak için number.round (6) kullanıyorum
gsumk

199

sprintf('%.2f', number)sayıları biçimlendirmenin şifreli ama çok güçlü bir yoludur. Sonuç her zaman bir dizedir, ancak yuvarladığınız için bunu zaten sunum amacıyla yaptığınızı varsayıyorum. sprintfherhangi bir sayıyı neredeyse istediğiniz şekilde biçimlendirebilir ve çok daha fazlasını yapabilirsiniz.

Tam sprintf belgeleri: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numberen azından tecrübelerime göre işler daha sık görülür.
Michael Kohl

6
@MichaelKohl Yakut stil kılavuzu sürümden yana sprintf(veya format) tercih eder %. Bunun bazı nedenleri burada tartışılmaktadır , çoğunlukla okunabilirlikle ilgilidir. Hepimiz sadece bazı nedenlerle stil rehberini takip etmek zorunda değiliz :)
Lucy Bain

3
3. ondalık basamaktan sonra sprintf'in 5 değil 6'da yuvarlandığını, örneğin sprintf ("%. 3f", 1.2225) "1.222", sprintf ("%. 3f", 1.2226) "1.223 ", bu sizin için önemliyse
#round

Ama 0.566666666666666yuvarlar0.57
Anwar

"%.2f"mermi 5aşağı yerine up, bunu düzeltmek için herhangi bir yolu var mı?
Mirror318

3

Düzenle

Geri bildirim aldıktan sonra, orijinal çözüm işe yaramadı gibi görünüyor. Bu nedenle cevabı önerilerden biri olarak güncelledi.

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

Yuvarlanmış 2 ondalık basamak sayısına sahip olmak istiyorsanız, diğer yanıtlar işe yarayabilir. Ancak, yuvarlamadan ilk iki ondalık basamaklı kayan nokta numaralarına sahip olmak istiyorsanız , Bu cevaplar yardımcı olmaz.

Bu nedenle, ilk iki ondalık basamaklı bir kayan nokta sayısı elde etmek için bu tekniği kullandım. Bazı durumlarda çalışmaz

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

ile 5.666666666666666666666666, 5.66yuvarlak yerine dönecektir 5.67. Umarım birine yardım eder


1
Bu işe yaramıyor. Çalışması için herhangi bir boyut numarasını hesaba katmanız gerekir. Burada uygulanan deseni kullanarak şunları yapabilirsiniz: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Veya daha basitfloat_n.to_d.round(2, :truncate).to_f
rorykoehler

Ondalık basamaktan önce 9'dan büyük bir int ile her şey
rorykoehler

Konu için teşekkürler. Ancak, önerilen yöntemleriniz büyük sayılarda da başarısız!
Anwar

İçin 11111111111111111.222222222222222bir giriş olarak, ilk gösterir 1.11, ikincisi gösterir1.11111111111111e+16
Enver

1
Evet haklısın ... 16 kez önde ya da üstünde. Taşma sorunu. Büyük sayılarla çalışıyorsanız en iyi ondalığa sadık kalın. Typecasting sorunu tanıtıyor
rorykoehler

-5

Bunu dene:

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
Cevapladığınız için teşekkürler. Soru İngilizce olarak sorulduğu için İngilizce olarak değiştirebilir misiniz?
Jared

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

-15

ondalık kesilecek aşağıdaki kodu kullandım:

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

2 ondalığa kısaltmak istiyorsanız şunu kullanmalısınız: Integr(a*100)*0.01


5
Yüzde dökümü yaparken bunu hiç kimse yapmamalıdır. Bu gerçekten kötü bir formdur çünkü keserek, en yakın 2 ondalık konuma düzgün şekilde YUVARLANABİLİRSİNİZ. sadece 0.455 keserseniz, yuvarlama için yanlış olan 0.45 elde edersiniz, çünkü 0.46 ile sonuçlanmalıdır. Asla ondalık sayıyı asla kesmeyin, yuvarlama meydana geldiğinde sonuç yanlış olur.
Gugaru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.