Skip to content

Instantly share code, notes, and snippets.

@yellow5
Created October 25, 2011 23:06
Show Gist options
  • Save yellow5/1314691 to your computer and use it in GitHub Desktop.
Save yellow5/1314691 to your computer and use it in GitHub Desktop.
wip of Float#round
class Float
def round(precision=0)
if precision == 0
round_up? ? ceil : floor
else
multiple_of_ten = 10.0 ** Integer(precision).abs
if precision > 0
if finite?
number = self * multiple_of_ten
if number.infinite?
self
else
if round_up?(number)
number.ceil / multiple_of_ten
else
number.floor / multiple_of_ten
end
end
else
self
end
else
if multiple_of_ten.infinite?
0
else
number = self / multiple_of_ten
if round_up?(number)
(1..Integer(precision).abs).inject(number.ceil) { |num| num * 10 }
else
(1..Integer(precision).abs).inject(number.floor) { |num| num * 10 }
end
end
end
end
end
def round_up?(value=self)
(value > 0 && (value - value.to_i).abs >= 0.5) || (value < 0 && (value - value.to_i).abs < 0.5)
end
private :round_up?
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment