Bagaimana Anda mengitari pelampung ke dua tempat desimal di jruby

172

JRuby 1.6.x. Bagaimana Anda mengitari pelampung ke tempat desimal di jruby.

number = 1.1164
number.round(2)

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

Bagaimana saya membulatkan ini ke 2 tempat desimal?

Sam
sumber

Jawaban:

87

Putaran float # dapat mengambil parameter di Ruby 1.9, bukan di Ruby 1.8. JRuby default ke 1.8, tetapi mampu berjalan dalam mode 1.9 .

steenslag
sumber
1
Saya tahu tampaknya bukan maksud Sam untuk membulatkan angka dengan tujuan menyajikan sesuatu seperti mata uang, tetapi perlu diketahui bahwa menggunakan #round (presisi) tidak akan berfungsi sebagaimana dimaksud jika Anda mencoba melakukan ini (3 .round (2) # => 3.0, bukan 3.00). Untuk mendapatkan ini, lihat jawabannya oleh Theo di bawah ini.
jaredsmith
290
(5.65235534).round(2)
#=> 5.65
boulder_ruby
sumber
12
(5.6).round(2)hanya mengembalikan 5,6
Bala Karthik
3
tampaknya masuk akal, bahwa tempat penampung ekstra nol masih ada, tidak terlihat
boulder_ruby
@BalaKarthik Itulah alasan mengapa saya menggunakan solusi oleh Theo. Ini membulatkan dengan benar (kecuali jika Anda melewati 3 desimal karena beberapa alasan aneh, lihat komentar), jadi itu adalah solusi yang lebih baik jika Anda mencari output string.
Dylan Vander Berg
ini benar. Saya adalah generasi garis lintang dan bujur acak sehingga saya menggunakan number.round (6) untuk 6 digit
gsumk
199

sprintf('%.2f', number)adalah cara sulit untuk memformat angka. Hasilnya selalu berupa string, tetapi karena Anda membulatkannya saya menganggap Anda melakukannya untuk tujuan presentasi. sprintfdapat memformat angka apa pun dengan cara apa pun yang Anda suka, dan masih banyak lagi.

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

Theo
sumber
79
'%.2f' % numberjuga karya lebih sering dilihat, setidaknya dalam pengalaman saya.
Michael Kohl
6
@MichaelKohl Panduan gaya ruby mendukung sprintf(atau format) %versi. Beberapa alasan untuk itu dibahas di sini , sebagian besar tentang keterbacaan. Bukan berarti kita semua harus mengikuti panduan gaya, hanya memberikan beberapa alasan :)
Lucy Bain
3
perhatikan bahwa setelah desimal ke-3, sprintf membulatkan pada 6, bukan pada 5, misalnya, sprintf ("%. 3f", 1.2225) akan menjadi "1.222", sprintf ("%. 3f", 1.2226) akan menjadi "1.223 ", jika itu penting bagi Anda, tetap gunakan #round
ecoding5
Tetapi 0.566666666666666berkeliling ke0.57
Anwar
"%.2f"membulatkan 5ke bawah, bukannya ke atas, apakah ada cara untuk memperbaikinya?
Mirror318
3

Edit

Setelah mendapatkan umpan balik, sepertinya solusi asli tidak berhasil. Itu sebabnya memperbarui jawabannya sebagai salah satu saran.

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

Jawaban lain mungkin berhasil, jika Anda ingin memiliki angka bulat 2 tempat desimal. Tapi, Jika Anda ingin memiliki angka floating point dengan dua tempat desimal pertama tanpa pembulatan , jawaban itu tidak akan membantu.

Jadi, untuk mendapatkan angka floating point dengan dua desimal pertama, saya menggunakan teknik ini. Dalam beberapa kasus tidak berfungsi

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

dengan 5.666666666666666666666666, itu akan kembali 5.66bukannya bulat 5.67. Semoga ini bisa membantu seseorang

Anwar
sumber
1
Ini tidak berhasil. Untuk membuatnya berfungsi, Anda harus memperhitungkan nomor ukuran apa pun. Dengan menggunakan pola yang diterapkan di sini, Anda dapat: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Atau jauh lebih sederhana yang dapat Anda gunakanfloat_n.to_d.round(2, :truncate).to_f
rorykoehler
Apa pun dengan int lebih besar dari 9 sebelum tempat desimal
rorykoehler
Terima kasih atas intinya. Tetapi, metode yang Anda sarankan juga gagal dalam jumlah besar!
Anwar
Sebagai 11111111111111111.222222222222222input, pertunjukan pertama 1.11dan pertunjukan kedua1.11111111111111e+16
Anwar
1
Ya Anda benar ... sekali 16 tempat di depan atau di atas. Masalah meluap. Tetap paling baik untuk desimal besar jika bekerja dengan angka besar. Typecasting memperkenalkan masalah
rorykoehler
-5

Coba ini:

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
sumber
3
Terimakasih telah menjawab. Bisakah Anda merevisinya dalam bahasa Inggris, karena pertanyaannya diajukan dalam bahasa Inggris.
Jared
Puedes traducir tu respuesta a inglés? Preguntas y respuestas en español deben existir aqui .
intcreator
-15

untuk memotong desimal saya telah menggunakan kode follow:

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

Jika Anda ingin memotong menjadi 2 desimal, Anda harus menggunakan Integr(a*100)*0.01

Ivan Carrasco Quiroz
sumber
5
Tidak seorang pun harus melakukan ini PERNAH ketika casting persentase. Ini adalah bentuk yang sangat buruk karena dengan memotong Anda kehilangan kemampuan untuk ROUND dengan benar ke 2 posisi desimal terdekat. yaitu 0,455 jika Anda hanya memotong Anda mendapatkan 0,45 yang salah untuk pembulatan karena harus menghasilkan 0,46. Jangan pernah memotong desimal selalu bulat angka yang lain hasilnya akan salah ketika mengumpulkan harus terjadi.
The Gugaru