Округление поплавка в рубине

126

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

Теги:
rounding

9 ответов

152
Лучший ответ

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

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

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

>> (2.3465*100).round / 100.0
=> 2.35
  • 2
    Благодарю. Я не знал, что спринтф позаботится о округлении для меня. sprintf '%.2f', 2.3465 также работает.
  • 56
    value.round (2) лучше, чем это решение
Показать ещё 3 комментария
354

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

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
  • 7
    Это казалось бы более разумным, чем умножение, округление и деление. +1
  • 3
    Хм, этот метод, похоже, не в ruby 1.8.7. Может в 1.9?
Показать ещё 3 комментария
6

Вы можете добавить метод в 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
3

вы можете использовать это для округления до точности.

//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          
3
def rounding(float,precision)
    return ((float * 10**precision).round.to_f) / (10**precision)
end
3

как насчет (2.3465*100).round()/100.0?

2

Вы также можете указать отрицательное число в качестве аргумента методу 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
1

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

  • 1
    Обратите внимание, что number_with_precision - это number_with_precision Rails-only.
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню