Câu trả lời:
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 .
(5.65235534).round(2)
#=> 5.65
(5.6).round(2)
chỉ trở về 5,6
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. sprintf
có 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
'%.2f' % number
cũng hoạt động thường thấy hơn, ít nhất là theo kinh nghiệm của tôi.
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 :)
0.566666666666666
tròn đến0.57
"%.2f"
làm tròn 5
xuống, thay vì lên, có cách nào khắc phục điều đó không?
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.66
thay vì làm tròn 5.67
. Hy vọng nó sẽ giúp được ai đó
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
11111111111111111.222222222222222
đầu vào, chương trình đầu tiên 1.11
và chương trình thứ hai hiển thị1.11111111111111e+16
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
để 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