From: nobu.nakada@... Date: 2002-09-18T10:20:54+09:00 Subject: [ruby-list:35966] Re: Float#to_r (Re: 9.2 の数値が 9.199999999999999) なかだです。 At Wed, 18 Sep 2002 05:01:12 +0900, Masaaki Sakano wrote: > Float を必要な精度で Rational に変換するための自作ライブラリ --- > 具体的には Float class に .to_r(prec=5) (precは精度) メソッドを > つけ加える --- を添付してみました。 Rationalの乗除算を繰り返してるのが気になったので、ちょっと書き 換えてみました。 > # fl2rat.rb > class Float > def to_r(prec=5) > ## Do "include Math" and "require 'rational'" first. > > case self > when Integer, Rational, 0 > return self.to_r > end Floatのメソッドなので、これは要らないのでは。 > if self < 0 > keta=10**(log10(-self).floor) > else > keta=10**(log10(self).floor) > end > > keta2=10**(prec-1) > (keta.to_r)*((self/keta)*keta2).round/keta2 > end > end class Float def to_r(prec = 5) ofs = prec - Math.log10(self.abs).floor - 1 num = (self * 10.0 ** ofs).round if ofs > 0 Rational.reduce(num, 10.power!(ofs)) else Rational.new(num * 10.power!(-ofs), 1) end end end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦