Sha256: 1f5b94baa843ab95469f899cc5030849447cee120631674bd73f33253f96732a

Contents?: true

Size: 1.77 KB

Versions: 18

Compression:

Stored size: 1.77 KB

Contents

require 'bigdecimal'

class FixedPoint
  
  PRECISION = 2
  
  ARITHMETIC_METHODS = %w{+ -}
  COMPARE_METHODS = %w{> < >= <= <=>}
  
  attr :value
  attr :factor
  attr :precision
  
  def initialize( initial = 0.0, raw_value = nil, precision=PRECISION )
    @precision = precision
    @factor = 10**@precision
    if raw_value
      @value = raw_value
    else
      @value =  (BigDecimal.new(initial.to_s.gsub(',',''), precision)*@factor).to_i
    end
  end
  
  def to_s
    @value.to_s
    "%.0#{@precision}f" % (@value.to_f/@factor)
  end
  
  def to_i
    (@value / @factor).to_i
  end
  
  def == obj
    if obj.is_a? Numeric
      @value == (obj * @factor).to_i
    elsif obj.is_a? FixedPoint
      @value == obj.value
    else
      false
    end
  end
  
  def abs
    if @value > 0
      FixedPoint.new(0, @value, @precision)
    else
      FixedPoint.new(0, -@value, @precision)
    end
  end
  
  def -@
    FixedPoint.new(0, -@value, @precision)
  end
  
  def *( arg )
    if arg.is_a? FixedPoint
      result = (@value * arg.value)/arg.factor
    else
      result = (@value * (arg*@factor).to_i) / @factor
    end
    new_obj = FixedPoint.new(0, result.to_i, @precision)
  end
  
  def /( arg )
    if arg.is_a? FixedPoint
      result = (@value*arg.factor) * arg.value
    else
      result = (@value*@factor) / (arg*@factor).to_i
    end
    new_obj = FixedPoint.new(0, result.to_i, @precision)
  end
  
  def method_missing method, *args
    if ARITHMETIC_METHODS.include? method.to_s
      arg = (args[0] * @factor).to_i
      result = @value.send(method, arg)
      new_obj = FixedPoint.new(0, result.to_i, @precision)
    elsif COMPARE_METHODS.include? method.to_s
      arg = (args[0] * @factor).to_i
      result = @value.send(method, arg)
    else
      super
    end
  end
  
end



Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
wdd-ruby-ext-0.6.3 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.6.2 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.6.0 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.5.1 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.5.0 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.4.4 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.4.3 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.4.2 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.4.1 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.4.0 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.3.3 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.3.2 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.3.1 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.3.0 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.2.3 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.2.2 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.2.1 lib/wdd-ruby-ext/utils/fixed_point.rb
wdd-ruby-ext-0.2.0 lib/wdd-ruby-ext/utils/fixed_point.rb