Rounding to the nearest number in Ruby
A while ago, I was taking a look at a problem on the rails forum. This post was submitted to find the best solution to round any number to the nearest multiple of 10. For example, this method would take the number 6 and return 10, or the number 29 and return 30. So the first thing that popped into my mind was modulus. We can use modulus to determine how far we are from the nearest multiple of 10. Meaning that if we are given 19 and we want to know how close we are to the nearest 10, we can simple do 19 % 10, which will return 9, and 10 - 9 is 1, so we are 1 away from the nearest 10 spot. Here is that method, assuming only Fixnum, so it is implemented as an extension of the Fixnum class:
1 2 3 4 5 6 7 8 |
class Fixnum def roundup return self if self % 10 == 0 # already a factor of 10 return self + 10 - (self % 10) # go to nearest factor 10 end end |
While this did the job, it was suggested that it would be better if things happened.
- Use the Numeric class (this class encompasses Float, Fixnum and Integer)
- Don't limit the method to just the nearest 10, have it as a parameter
- And an added bonus - rounddown()
Here is the resulting code (defaulting to 10):
1 2 3 4 5 6 7 8 9 10 |
class Numeric def roundup(nearest=10) self % nearest == 0 ? self : self + nearest - (self % nearest) end def rounddown(nearest=10) self % nearest == 0 ? self : self - (self % nearest) end end |
Well that is pretty cool, here is some sample output from using this method:
1 2 3 4 5 6 7 8 9 |
puts 2.roundup #=> 10 puts 23.roundup #=> 30 puts 20.roundup #=> 20 puts 45.roundup #=> 50 puts 156.roundup #=> 160 puts 156.34.roundup #=> 160.0 puts 16.34.roundup #=> 20.0 puts 81.1234.roundup #=> 90.0 |
6 Responses
to “Rounding to the nearest number in Ruby”
Sorry, comments for this entry are closed at this time.
How about this addition?
def roundnearest(nearest=10)
up = roundup(nearest)
down = rounddown(nearest)
if (up-self) < (self-down)
return up
else
return down
end
end
@Tim – great addition, thanks for posting it 🙂
What is modulus and where are you putting this code?
@Hamoth – modulus returns the remainder of a division. For example if I have modulus(5/2) I will get 1. modulus(10/7), I will get 3. In rails, this code would go in its own file under RAILS_ROOT/config/initializers/. Otherwise, you would just put this code in its own file and require it in your other source code.
Tim, I think for rounding to nearest, you’ll find this is easier 🙂
Thanks for this, exactly what I needed to round an int up to nearest 500 🙂