[#36686] 1.1 < 61.1 - 60.0 — Shin-ichiro HARA <sinara@...>

原です。

19 messages 2002/12/06

[#36770] www.ruby-lang.orgリニューアル準備のお知らせ — TADA Tadashi <sho@...>

ruby-lang.orgのwebmasterチームでは、タイムリーな情報提供と使いやすい

11 messages 2002/12/16

[ruby-list:36691] Float_fixed_cmp.rb ← 1.1 < 61.1 - 60.0

From: Take_tk <ggb03124@...>
Date: 2002-12-06 06:26:04 UTC
List: ruby-list #36691
たけ(tk)です

[ruby-list:36690] Re: 1.1 < 61.1 - 60.0 にて
Take_tk <ggb03124@nifty.ne.jp> さん曰く:

>   Float_fixed_cmp.rb を作って require すれば?

役に立ちそうなのでライブラリの形にしちゃいます。

----
G:/Apollo/TkUtils/Float_fixed_cmp.rb
----
#-- Float_fixed_cmp.rb
#
#  10000倍して整数で比較する。
#  require "Float_fixed_cmp" で Floatの比較演算子の挙動が変る。
#  倍率は Float.fix_rate で変更可能
#  Float.fixed_cmp = false にすると元の Float での比較を行う。
#
# 2002-12-06 take_tk
#

if __FILE__ == $0
  a = 1.1
  b = 61.1 - 60.0

  p( a < b)     #=> true
  p( a == b )   #=> false
  p( a <=> b )  #=> -1
end

class Float
  $FIX=10000
  $FIXED_CMP = true
  def self.fix_rate=(v)
    $FIX = v
  end
  def self.fix_rate
    $FIX
  end
  def self.fixed_cmp=(v)
    $FIXED_CMP = v
  end
  def self.fixed_cmp
    $FIXED_CMP
  end
  def fix
    (self*$FIX).to_i
  end

  alias _cmp <=>
  def <=>(other)
    if $FIXED_CMP && $FIX
      self.fix <=> other.fix  # Integer#<=>
    else
      self._cmp(other)
    end
  end

  alias _eq ==
  def ==(other)
    if $FIXED_CMP && $FIX
      self.fix == other.fix  # Integer#==
    else
      self._eq(other)
    end
  end

  alias _lt <
  def <(other)
    if $FIXED_CMP && $FIX
      self.fix < other.fix    # Integer#<
    else
      self._lt(other)
    end
  end

  alias _le <=
  def <=(other)
    if $FIXED_CMP && $FIX
      self.fix <= other.fix   # Integer#<=
    else
      self._le(other)
    end
  end

  alias _gt >
  def >(other)
    if $FIXED_CMP && $FIX
      self.fix > other.fix    # Integer#>
    else
      self._gt(other)
    end
  end

  alias _ge >=
  def >=(other)
    if $FIXED_CMP && $FIX
      self.fix >= other.fix   # Integer#>=
    else
      self._ge(other)
    end
  end
end

if __FILE__ == $0
  p( a < b)     #=> false
  p( a == b )   #=> true
  p( a <=> b )  #=> 0

  Float.fixed_cmp = false

  p( a < b)     #=> true
  p( a == b )   #=> false
  p( a <=> b )  #=> -1
end
----

Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武


In This Thread