Module: Tins::Round

Defined in:
lib/tins/round.rb,
lib/tins/xt/round.rb

Overview

A bit more versatile rounding for Ruby

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/tins/round.rb', line 4

def self.included(klass)
  if klass.instance_method(:round)
    klass.class_eval do
      begin
        alias_method :__old_round__, :round
        remove_method :round
      rescue NameError
      end
    end
    super
  else
    raise NoMethodError, 'no round method found'
  end
end

Instance Method Details

#round(places = nil) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/tins/round.rb', line 19

def round(places = nil)
  if places == nil || places == 0
    return __old_round__
  elsif places.respond_to?(:to_int)
    places = places.to_int
  else
    raise TypeError, "argument places has to be like an Integer"
  end
  if places < 0
    max_places = -Math.log(self.abs + 1) / Math.log(10)
    raise ArgumentError, "places has to be >= #{max_places.ceil}" if max_places > places
  end
  t = self
  f = 10.0 ** places
  t *= f
  if t.infinite?
    result = self
  else
    if t >= 0.0
      t = (t + 0.5).floor
    elsif t < 0.0
      t = (t - 0.5).ceil
    end
    t /= f
    result = t.nan? ? self : t
  end
  max_places and result = result.to_i # if places < 0
  result
end