2010-01-13 54 views
125

Tôi đang gặp vấn đề làm tròn. Tôi có một phao, mà tôi muốn làm tròn đến hàng trăm thập phân. Tuy nhiên, tôi chỉ có thể sử dụng .round mà về cơ bản biến nó thành một int, có nghĩa 2.34.round # => 2. Có tác dụng cách đơn giản để làm điều gì đó như 2.3465 # => 2.35Làm tròn phao trong Ruby

+1

'2.3465.round (2) => 2.35' – Magne

Trả lời

159

Khi hiển thị, bạn có thể sử dụng (ví dụ)

>> '%.2f' % 2.3465 
=> "2.35" 

Nếu bạn muốn lưu trữ nó tròn, bạn có thể sử dụng

>> (2.3465*100).round/100.0 
=> 2.35 
+0

câu trả lời tuyệt vời cảm ơn bạn, tôi biết có một cách đơn giản để làm nó. – user211662

+2

Cảm ơn. Tôi đã không nhận ra chạy nước rút sẽ chăm sóc làm tròn cho tôi. 'sprintf '% .2f', 2.3465' cũng hoạt động. –

+46

value.round (2) là tốt hơn so với giải pháp này –

358

Vượt qua một cuộc tranh cãi để làm tròn chứa số chữ số thập phân làm tròn đến

>> 2.3465.round 
=> 2 
>> 2.3465.round(2) 
=> 2.35 
>> 2.3465.round(3) 
=> 2.347 
+7

Điều này có vẻ hợp lý hơn nhân, làm tròn và chia. +1 –

+3

Hmm phương pháp này dường như không có trong ruby ​​1.8.7. Có lẽ trong 1.9? –

+2

@Brian. Điều này chắc chắn là 1,9 và cũng nằm trong đường ray (Câu hỏi này được gắn thẻ) –

6

Bạn có thể thêm một phương pháp trong phao Class, tôi học được điều này từ stackoverflow:

class Float 
    def precision(p) 
     # Make sure the precision level is actually an integer and > 0 
     raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0 
     # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0 
     return self.round if p == 0 
     # Standard case 
     return (self * 10**p).round.to_f/10**p 
    end 
end 
3
def rounding(float,precision) 
    return ((float * 10**precision).round.to_f)/(10**precision) 
end 
0

Đối với ruby ​​1.8.7, bạn có thể thêm thông tin sau vào mã của mình:

class Float 
    alias oldround:round 
    def round(precision = nil) 
     if precision.nil? 
      return self 
     else 
      return ((self * 10**precision).oldround.to_f)/(10**precision) 
     end 
    end 
end 
1

Nếu bạn chỉ cần hiển thị nó, tôi sẽ sử dụng trình trợ giúp number_with_precision. Nếu bạn cần nó ở một nơi khác tôi sẽ sử dụng, như Steve weet chỉ, các round phương pháp

+1

Lưu ý rằng 'number_with_precision' là phương thức Rails-only. – Smar

3

Bạn cũng có thể cung cấp một số tiêu cực như một cuộc tranh cãi với phương pháp round làm tròn đến bội số gần nhất của 10, 100 và vân vân .

# Round to the nearest multiple of 10. 
12.3453.round(-1)  # Output: 10 

# Round to the nearest multiple of 100. 
124.3453.round(-2)  # Output: 100 
5

bạn có thể sử dụng điều này để làm tròn đến một precison ..

//to_f is for float 

salary= 2921.9121 
puts salary.to_f.round(2) // to 2 decimal place     

puts salary.to_f.round() // to 3 decimal place   
Các vấn đề liên quan