Reputation: 229
I'm trying to define a function that respects the following rounding conditions (round to the closest integer or tenth):
The main issue I found out, was around rounding negative numbers.
Here is my implementation (sorry for the conditional check but its just for this example):
def convention_round(number, to_int = false)
if to_int
number.round
else
number.round(1)
end
end
convention_round(1.2234) # 1.2
convention_round(1.2234, true) # 1
convention_round(1.896) # 1.9
convention_round(1.896, true) # 2
convention_round(1.5) # 1.5
convention_round(1.5, true) # 2
convention_round(1.55) # 1.6
convention_round(1.55, true) # 2
convention_round(-1.2234) # -1.2
convention_round(-1.2234, true) # -1
convention_round(-1.896) # -1.9
convention_round(-1.2234, true) # -2
convention_round(-1.5) # -1.5
convention_round(-1.5, true) # -2 (Here I want rounded to -1)
convention_round(-1.55) # -1.6 (Here I want rounded to -1.5)
convention_round(-1.55, true) # -2
I'm not 100% sure what is the best approach for rounding the negative numbers.
Thank you!
Upvotes: 2
Views: 458
Reputation: 28285
From the docs, you can use Integer#round
(and Float#round
) for this, as follows:
def convention_round(number, precision = 0)
number.round(
precision,
half: (number.positive? ? :up : :down)
)
end
convention_round(1.4) #=> 1
convention_round(1.5) #=> 2
convention_round(1.55) #=> 2
convention_round(1.54, 1) #=> 1.5
convention_round(1.55, 1) #=> 1.6
convention_round(-1.4) #=> -1
convention_round(-1.5) #=> -1 # !!!
convention_round(-1.55) #=> -2
convention_round(-1.54, 1) #=> -1.55
convention_round(-1.55, 1) #=> -1.5 # !!!
This isn't quite the method signature you asked for, but it's a more generic form - since you can supply an arbitrary precision.
However, I would like to point out the irony that (despite the method name) this is not a conventional way of rounding numbers.
There are a few different conventions, all(?) of which are supported by the ruby core library (see above link to docs), but this is not one of them.
Upvotes: 6