Round floats to the nearest X
For those pesky times when whole numbers just won’t cut it, but you only want some precision.
7.7.round(0.5) #=> 7.5 7.95.round(0.5) #=> 8 8.2.round(1.5) #=> 7.5 8.3.round(1.5) #=> 9
The magic, courtesy of Daniel Morrison:
class Float def round(round_to = 1.0) mod = self % round_to rounded = self - mod + (mod >= round_to/2.0 ? round_to : 0) rounded % 1 == 0 ? rounded.to_i : rounded end end
Note that do to some quirks with Ruby’s handling of floats, you won’t get what you expect in some situations:
3.5.round(0.2) #=> 3.4, instead of 3.6
4 Comments
This is a little more complicated, but it correctly rounds
results:
class Float alias_method :old_round, :round unless method_defined?(:old_round) def round(round_to = 1.0) scaled = self / round_to rounded = scaled.old_round * round_to rounded % 1 == 0 ? rounded.to_i : rounded end endWhat about:
require 'bigdecimal' class Float def round(to = 0) rounded = BigDecimal(self.to_s).round(to) to == 0 ? rounded.to_i : rounded end endFor what it’s worth… matt’s benchmark’ed as the quickest:
user system total real
mjones 0.260000 0.010000 0.270000 ( 0.283507)
original 0.330000 0.010000 0.340000 ( 0.362051)
dkubb 0.700000 0.010000 0.710000 ( 0.717374)
For what it’s worth… matt’s benchmark’ed as the quickest:
user system total real mjones 0.260000 0.010000 0.270000 ( 0.283507) original 0.330000 0.010000 0.340000 ( 0.362051) dkubb 0.700000 0.010000 0.710000 ( 0.717374)