• ベストアンサー

Ruby1.9での数値→文字変換について。

Ruby1.9での数値→文字変換について。 以下のようにfloat型の数値を文字に変換したいのですが、 どのようなロジックで書けば宜しいでしょうか? (例) 1.1→"1.1" 1.12→”1.12” 1.123→”1.123” sprintf("%f",data)を使っていますが、上記の1.1の例ですと "1.100000"となってしまいます。つまり、不要な"0"を取りたいのです。 また、少数点以下の桁数によっても考慮が必要に思われます。 どうかアドバイスをお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

BigDecimalについては、こちらを参照ください。 http://www.ruby-lang.org/ja/man/html/.html 内容については、notnot様の回答の通りです。 簡単なサンプルを作りましたので動きの参考にしていただければ。 (bigdecimalを利用した場合は、全ての演算でbigdecimal型を利用する必要があります。) require 'bigdecimal' require "bigdecimal/util" #適当なbigdecimalの出力桁数調整関数 def printtd(d,n=15) d.to_s("f").slice(Regexp.new("^(\\d+(\\.\\d{1,#{n}})?)")) end data = (2.0).to_d #to_dでFloat型をBigDecimal型に変換できる。 p data.class data = data.sqrt(16) p printtd(data) #少数13桁以下はFloat型では表現できない為文字列から変換する。 data2 = BigDecimal("1.123456789012345") p data2.class p printtd(data2) #これだとおかしくなる。(200.0はfloat型) w = data + 200.0 p w.class #演算結果がfloat型になってしまう。(有効桁数の減少) p w #型変換を回避するため、常にbigdecimal型同士で演算する。 w =data + (200.0).to_d p w.class p printtd(w) #有効桁数が保障される。

NOBU4517
質問者

お礼

サンプル提示にて理解がスムーズに出来ました。 本当に有難うございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

コンピュータで扱う数値には有効桁数があります。例えば、安い電卓だと8桁ですよね。 組み込みの実数型は十数桁です。お使いの環境では、 >"1.123456789012"と少数点3桁分が欠如します。 約13桁のようですね。私の環境では "1.12345678901235" となり、約15桁です。 もっと多くの桁を使いたいときに利用するのが BigDecimal です。と言うわけで、 >BigDecimalは、文字列を数値に変換するためのものではないでしょうか。 は違います。 組み込みの実数型を使う限りは約13桁を越える計算は出来ません。 >そのものずばりの表現で申しますと、少数点以下15桁まで使用したいのです。 BigDecimalを使いましょう。計算速度は遅くなりますが、希望の桁数で計算できます。が、組み込みでないので、a = 1.123456789012345 等と書くことが出来ず、a = BigDecimal("1.123456789012345") と書く必要があります。

NOBU4517
質問者

お礼

私の勘違いがこの指摘に良く理解できました。 世の中、達人がたくさんいることを改めて思わしてもらいました。 この度は誠に有難うございました。

すると、全ての回答が全文表示されます。
回答No.2

floatの精度は環境依存なのでなんとも言えません。 精度が求められる計算をしたい場合、bigdecimalを使われてみてはいかがでしょうか? require 'bigdecimal' s = BigDecimal("1.123456789012345123456789012345") puts s.to_s("f") #ためしに減算してみる。 s -= BigDecimal("0.000000000000000000000000000001") puts s.to_s("f")

NOBU4517
質問者

お礼

素早いご回答誠に有難う御座います。 当方素人であるため、幼稚な質問かも知れませんがご容赦ください。 ご回答頂いた内容のBigDecimalは、文字列を数値に変換するためのものではないでしょうか。 当方の問題点としましては、数値(float)を文字型に変換するプログラムを書いておりまして、 その数値が、例として1.123456789012345とさせて頂いた次第です。 この数値をご回答頂いた方法(to_s)で試した結果、"1.123456789012"となり、 少数点以下の3桁が欠如されて文字型に変換されており、その対策をご教示頂ければと 思わして頂いた次第です。 また、デバッグの過程にて、 puts 1.123456789012345を実行した場合、1.123456789012となりました。 つまり、この状態で既に少数点以下の3桁が欠如されて表示されます。 これは、環境依存というご回答もありましたが、ここに関連しているのでしょうか。 この少数点以下の桁数増やすことは可能なのでしょうか。 そのものずばりの表現で申しますと、少数点以下15桁まで使用したいのです。

すると、全ての回答が全文表示されます。
回答No.1

to_sを使われてみてはいかがでしょうか? data=1.1 p data.to_s または、単純に出力したいのであれば式展開を利用すれば勝手にto_sされます。 p "#{data}" 逆引きRubyも参考に。 http://www.namaraii.com/rubytips/

NOBU4517
質問者

お礼

nekomikemo様 有難う御座いました。解決しました。 (逆引きRubyも参考にさせていただきました) ただ、新たに次の課題が出てきました。 (例) 1.123456789012345を上記の方法で文字に変換しますと、 "1.123456789012"と少数点3桁分が欠如します。 また、p 1.123456789012345の結果自体、1.123456789012となりますので、 何か指定の仕方があるように思われます。 ご存知ではないでしょうか。

すると、全ての回答が全文表示されます。

関連するQ&A