2010-01-13 4 views
125

У меня проблемы округления. У меня есть float, который я хочу округлить до сотых десятичных знаков. Тем не менее, я могу использовать только .round, который в основном превращает его в междунар, что означает 2.34.round # => 2. Есть ли простой эффект способ сделать что-то вроде 2.3465 # => 2.35Округление поплавка в рубине

+1

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

ответ

159

При отображении, можно использовать (например)

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

Если вы хотите сохранить его округленным, вы можете использовать

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

большой ответ спасибо, я знал, что есть простой способ сделать Это. – user211662

+2

Спасибо. Я не понимал, что спринтф позаботится обо мне. 'sprintf '% .2f', 2.3465' также работает. –

+46

value.round (2) лучше, чем это решение –

358

Передает аргумент округлять, содержащий количество десятичных знаков после запятой округлить

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

Это кажется более разумным, чем умножение, округление и деление. +1 –

+3

Хмм этот метод, похоже, не в рубине 1.8.7. Может быть, в 1.9? –

+2

@Brian. Это определенно в 1.9, а также в рельсах (для которых этот вопрос был отмечен). –

6

Вы можете добавить метод в Float классе, я узнал об этом из 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

Для ruby ​​1.8.7 вы можете добавить в код код:

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

Если вам просто нужно его отобразить, я бы использовал вспомогательный помощник number_with_precision. Если вам это нужно где-то еще я хотел бы использовать, как указано Стив Weet, метод round

+1

Обратите внимание, что 'number_with_precision' - это метод только для Rails. – Smar

3

Вы также можете предоставить отрицательное число в качестве аргумента методу round округление до ближайшего числа, кратного 10, 100 и так далее ,

# 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

вы можете использовать это для округления до 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