Làm thế nào để bạn làm tròn một dấu phẩy đến hai chữ số thập phân trong jruby


172

JRuby 1.6.x. Làm thế nào để bạn làm tròn một dấu phẩy đến vị trí thập phân trong jruby.

number = 1.1164
number.round(2)

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

Làm thế nào để tôi làm tròn số này đến 2 chữ số thập phân?

Câu trả lời:


87

Float # round có thể lấy tham số trong Ruby 1.9, không phải trong Ruby 1.8. JRuby mặc định là 1.8, nhưng nó có khả năng chạy ở chế độ 1.9 .


1
Tôi biết rằng Sam dường như không có ý định làm tròn số với mục đích trình bày một thứ gì đó như tiền tệ, nhưng lưu ý rằng việc sử dụng #round (chính xác) sẽ không hoạt động như dự định nếu bạn đang cố gắng làm điều này (3 .round (2) # => 3.0, không phải 3.00). Để có được điều này, hãy xem câu trả lời của Theo bên dưới.
jaredsmith

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

12
(5.6).round(2)chỉ trở về 5,6
Bala Karthik

3
có vẻ hợp lý, chỗ giữ không có thêm đó vẫn còn đó, nó chỉ không nhìn thấy được
boulder_ruby

@BalaKarthik Đó là lý do tại sao tôi đang sử dụng giải pháp của Theo. Nó làm tròn chính xác (trừ khi bạn vượt qua 3 số thập phân vì một số lý do kỳ lạ, xem bình luận), vì vậy đó là giải pháp tốt hơn nếu bạn đang tìm kiếm đầu ra chuỗi.
Dylan Vander Berg

đúng rồi đó. Tôi đã tạo vĩ độ và kinh độ ngẫu nhiên nên tôi sử dụng number.round (6) cho 6 chữ số
gsumk

199

sprintf('%.2f', number)là một cách khó hiểu, nhưng rất mạnh mẽ về định dạng số. Kết quả luôn luôn là một chuỗi, nhưng vì bạn làm tròn nên tôi cho rằng bạn đang làm nó cho mục đích thuyết trình. sprintfcó thể định dạng bất kỳ số nào gần như bất kỳ cách nào bạn thích, và nhiều hơn nữa.

Tài liệu sprintf đầy đủ: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % numbercũng hoạt động thường thấy hơn, ít nhất là theo kinh nghiệm của tôi.
Michael Kohl

6
@MichaelKohl Hướng dẫn phong cách ruby ủng hộ sprintf(hoặc format) trên %phiên bản. Một số lý do cho điều đó được thảo luận ở đây , chủ yếu là về khả năng đọc. Không phải tất cả chúng ta đều phải tuân theo hướng dẫn về phong cách, chỉ cần đưa ra một số lý do :)
Lucy Bain

3
lưu ý rằng sau số thập phân thứ 3, sprintf làm tròn lên 6, chứ không phải trên 5, ví dụ, sprintf ("%. 3f", 1.2225) sẽ là "1.222", sprintf ("%. 3f", 1.2226) sẽ là "1.223" ", Nếu điều đó quan trọng với bạn, hãy sử dụng #round
ecoding5

Nhưng làm 0.566666666666666tròn đến0.57
Anwar

"%.2f"làm tròn 5xuống, thay vì lên, có cách nào khắc phục điều đó không?
Mirror318

3

Biên tập

Sau khi nhận được phản hồi, có vẻ như giải pháp ban đầu đã không hoạt động. Đó là lý do tại sao cập nhật câu trả lời là một trong những gợi ý.

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

Các câu trả lời khác có thể hoạt động, nếu bạn muốn có số làm tròn là 2 chữ số thập phân. Nhưng, nếu bạn muốn có số dấu phẩy động với hai chữ số thập phân đầu tiên mà không làm tròn , Những câu trả lời đó sẽ không hữu ích.

Vì vậy, để có được một số dấu phẩy động với hai chữ số thập phân đầu tiên, tôi đã sử dụng kỹ thuật này. Không hoạt động trong một số trường hợp

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

với 5.666666666666666666666666, nó sẽ trở lại 5.66thay vì làm tròn 5.67. Hy vọng nó sẽ giúp được ai đó


1
Điều này không hoạt động. Để làm cho nó hoạt động, bạn cần phải tính đến bất kỳ số lượng kích thước. Sử dụng mô hình được triển khai ở đây, bạn có thể: def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end Hoặc đơn giản hơn nhiều bạn có thể sử dụngfloat_n.to_d.round(2, :truncate).to_f
rorykoehler

Bất cứ điều gì có số nguyên lớn hơn 9 trước vị trí thập phân
rorykoehler

Cảm ơn bạn cho điểm. Nhưng, phương pháp đề xuất của bạn thất bại trên số lượng lớn quá!
Anwar

Đối với 11111111111111111.222222222222222đầu vào, chương trình đầu tiên 1.11và chương trình thứ hai hiển thị1.11111111111111e+16
Anwar

1
Có bạn đúng ... một lần 16 vị trí ở phía trước hoặc hơn. Vấn đề tràn. Tốt nhất dính vào thập phân lớn nếu làm việc với số lượng lớn. Typecasting giới thiệu vấn đề
rorykoehler

-5

Thử cái này:

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
Cảm ơn đã trả lời. Bạn có thể vui lòng sửa lại bằng tiếng Anh không, vì câu hỏi đã được hỏi bằng tiếng Anh.
Jared

Puedes traducir tu respuesta một inglés? Preguntas y respuestas en Español deben tồn tại aqui .
intcreator

-15

để cắt một số thập phân tôi đã sử dụng mã sau:

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

Nếu bạn muốn cắt ngắn thành 2 số thập phân, bạn nên sử dụng Integr(a*100)*0.01


5
Không ai nên làm điều này EVER khi đúc tỷ lệ phần trăm. Đây thực sự là một hình thức tồi tệ bởi vì bằng cách cắt bớt, bạn mất khả năng ROUND đúng cách đến 2 vị trí thập phân gần nhất. tức là 0,455 nếu bạn chỉ cắt bớt, bạn nhận được 0,45, điều đó là sai khi làm tròn bởi vì nó sẽ dẫn đến 0,46. Không bao giờ cắt một số thập phân luôn làm tròn số khác, kết quả sẽ sai khi làm tròn phải ocurr.
Gugaru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.