• ベストアンサー

小数の計算の精度について

Perlでプログラムを作成しているのですが、小数の乗算を行う際に、計算が合わなくなって困っています。 例: 10000*1.005=10049 コンピューターの性質上、小数の乗算等は精度に問題があるのは分かっているのですが。 VB等では変数の型をうまく設定すれば計算出来るのですが、Perlではどのような方法でこの現象を回避できるのでしょうか。 もし、よい知恵がありましたらよろしくお願いします。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.2

 実際の数値ということですが、それはあきらかにおかしいです(^_^;  Perl そのものが内部で破壊されているか、プログラムにバグがあるか、コンピュータ自身がバグつきペンティアムを載せているかです。  たかだか8桁の数字で狂うことは、通常であればありえません。  printf のところに、%d を使ってませんか?  これは本来小数点なしの整数を表すためのものですので、単精度整数以上を扱う場合は %f を使うのが望ましいのです。  まずはこれを確認してみてください。

pco
質問者

お礼

回答ありがとうございます。 確認したところ、計算処理後にintで整数に変換しておりました。 その部分を修正しますと計算が正確に出来るようになりました。 ありがとうございました。

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 数値はただのサンプルですよね?  実際にはどのような問題が発生しているのでしょうか。  Perl では、全ての変数が内部で自動切換えで制御されているので、一度1000倍にするなりなんなりしてから計算したり、または数字の文字列を自前の計算ロジックで計算させたりといった方法をとるしかありません。  ですので、ケースによってその対処法は変わってきますので、実際の不具合をみないと、これ、といった方法はないのです。  また、Perl はたしか倍制度整数までちゃんとサポートしていたはずなので、サンプルに記載された程度の数値を扱っているレベルであれば、心配は無意味です。

pco
質問者

補足

例の数値は実際の数値です。 状況的には 単価(整数8ケタ)×数量(整数部5ケタ、小数部3ケタ)=金額(整数9ケタ) という計算になります。 やはり、処理的には文字列で計算を行うのが一番よい方法ということになるのでしょうか。