--Multipart_Tue_Sep_17_21:01:01_2002-1
Content-Type: text/plain; charset=ISO-2022-JP

坂野 正明です。

At Tue, 17 Sep 2002 15:07:11 +0900,
<rubyist / mh1.117.ne.jp> wrote:
> 9.2の数値を代入し、させると9.199999999999999になりました。
> これって、仕方が無いことでしょうか?

At Tue, 17 Sep 2002 15:55:45 +0900
<f-hiro / eweb.co.jp> wrote:
>  用途にもよるとは思いますが、速度を無視すればRubyだとBignumが使えるので、
> 浮動小数の代わりにゲタをはかせた数値で演算するというのはどうでしょうか?

9.2 くらいの精度でいいのならば、(かつ速度を無視できれば)
require "rational"
Rational(92,10)
と扱えばいいかと思います。

require "mathn"
も行なうと、92/10 で済むので、簡単に韻討いいも;


縄閨を必要な精度で Rational に変換するための自作ライブラリ ---
具体的には Float class に .to_r(precP (precは精度) メドを
つけ加える --- を添付してみました。

坂野 正明

--Multipart_Tue_Sep_17_21:01:01_2002-1
Content-Type: text/plain; charset=US-ASCII

# fl2rat.rb
class Float
  def to_r(precP
    ## Do "include Math" and "require 'rational'" first.

    case self
    when Integer, Rational, 0
      return self.to_r
    end

    if self < 0
      keta**(log10(-self).floor)
    else
      keta**(log10(self).floor)
    end

    keta2**(prec-1)
    (keta.to_r)*((self/keta)*keta2).round/keta2
  end
end

--Multipart_Tue_Sep_17_21:01:01_2002-1
Content-Type: text/plain; charset=US-ASCII

irb(main):001:0> require  'rational'
true
irb(main):002:0> include Math
Object
irb(main):003:0> require "fl2rat"
true
irb(main):004:0> 9.2.to_r
Rational(46, 5)
irb(main):005:0> 99.999.to_r
Rational(99999, 1000)
irb(main):006:0> 99.9999.to_r
Rational(100, 1)
irb(main):007:0> 99.9999.to_r(6)
Rational(999999, 10000)
irb(main):008:0> -99.9999.to_r(6)
Rational(-999999, 10000)
irb(main):009:0> 9.2e-10.to_r
Rational(23, 25000000000)
irb(main):011:0> 23.0/25000000000
9.2e-10
irb(main):012:0> 

--Multipart_Tue_Sep_17_21:01:01_2002-1--