У меня проблемы с округлением. У меня есть число с плавающей точкой, которое я хочу округлить до сотых долей. Однако я могу использовать только .round, что в основном превращает его в int, что означает 2.34.round # => 2. Есть ли простой способ сделать что-то вроде 2.3465 # => 2.35
.round
2.34.round # => 2.
2.3465 # => 2.35
Передать в раунд аргумент, содержащий число десятичных разрядов, до
>> 2.3465.round => 2 >> 2.3465.round(2) => 2.35 >> 2.3465.round(3) => 2.347
При отображении вы можете использовать (например)
>> '%.2f' % 2.3465 => "2.35"
Если вы хотите хранить его округленным, вы можете использовать
>> (2.3465*100).round / 100.0 => 2.35
Вы можете использовать это для округления до точной резоны ..
//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
Вы можете добавить метод в Float Class, я узнал об этом из 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
Вы также можете указать отрицательное число в качестве аргумента метода round для округления до ближайшего кратного 10, 100 и т. Д.
round
# 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
def rounding(float,precision) return ((float * 10**precision).round.to_f) / (10**precision) end
а как же (2.3465*100).round()/100.0?
(2.3465*100).round()/100.0
Если вам просто нужно отобразить его, я бы использовал помощник number_with_precision . Если вам это нужно где-то еще, я бы использовал, как указал Стив Уит, метод round
Для 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