A way to round Floats down

25,359

Solution 1

Based on answer from @kimmmo this should be a little more efficient:

class Float
  def round_down n=0
  s = self.to_s
  l = s.index('.') + 1 + n
  s.length <= l ? self : s[0,l].to_f
  end
end

1.9991.round_down(3)
 => 1.999
1.9991.round_down(2)
 => 1.99
1.9991.round_down(0)
 => 1.0
1.9991.round_down(5)
 => 1.9991

or based on answer from @steenslag, probably yet more efficient as there is no string conversion:

class Float
  def round_down n=0
    n < 1 ? self.to_i.to_f : (self - 0.5 / 10**n).round(n)
  end
end

Solution 2

1.9999.to_i
#=> 1
1.9999.floor
#=> 1

answered 1 sec ago fl00r

"%.2f" % 1.93213
#=> 1.93

@kimmmo is right.

class Float
  def round_down(n=0)
    self.to_s[/\d+\.\d{#{n}}/].to_f
  end
end

Solution 3

Looks like you just want to strip decimals after n

class Float
  def round_down(n=0)
    int,dec=self.to_s.split('.')
    "#{int}.#{dec[0...n]}".to_f
  end
end


1.9991.round_down(3)
 => 1.999
1.9991.round_down(2)
 => 1.99
1.9991.round_down(0)
 => 1.0
1.9991.round_down(10)
 => 1.9991

(Edit: slightly more efficient version without the regexp)

Solution 4

You could use the floor method

http://www.ruby-doc.org/core/classes/Float.html#M000142

Solution 5

For anybody viewing this question in modern times (Ruby 2.4+), floor now accepts an argument.

> 1.9999.floor(1)
 => 1.9
> 1.9999.floor(2)
 => 1.99
> 1.9999.floor(3)
 => 1.999
> 1.9999.ceil(2)
 => 2.0
Share:
25,359
Michael Koper
Author by

Michael Koper

Updated on August 04, 2021

Comments

  • Michael Koper
    Michael Koper over 2 years

    Float round rounds it up or down. I always need it to round down.

    I have the solution but i dont really like it... Maybe there is a better way.

    This is what i want:

    1.9999.round_down(2) 
    #=> 1.99
    1.9901.round_down(2)
    #=> 1
    

    I came up with this solution but i would like to know if there is a better solution(I dont like that i convert the float twice). Is there already a method for this? Because I found it pretty strange that I couldnt find it.

    class Float
      def round_down(n=0)
        ((self * 10**n).to_i).to_f/10**n 
      end
    end
    

    Thanks.