- ベストアンサー
小数点計算について
皆さん教えてください 小数点を含む計算ロジックを作成中でバグ?と思われる結果が出てしまいました my $data1 = "5"; my $data2 = "4.9"; my $data3 = "0"; $data3 = $data1 - $data2; 本来なら「$data3」には「0.1」が入るはずなのですが、 実行すると「$data3」には「0.0999999999999996」が代入されてしまいました この場合にどうしたらよいか、アドバイス・対処方法を教えてください 以上、宜しくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
追加。 perlfaq4 http://faq.perl.org/perlfaq4.html#Data_Numbers 多分日本語訳もどこかに転がってると思うので 探してみてください。 わたしはこのあとしばらく反応できなくなりますが 多分親切な人が回答を寄せてくれる…はず。
その他の回答 (3)
- bgbg
- ベストアンサー率53% (94/175)
このあたりも見ておくといいでしょう。 http://www.kentei.ne.jp/quali/column/knowhow/030415.html 基本的な対策としては、有効桁数で丸める、小数は扱わず全て整数にする。 メートル売りならcm単位にして小数をなくすのも手です。
- Tacosan
- ベストアンサー率23% (3656/15482)
計算機では小数を 2進数で表現する (のが普通な) ので, どうしようもないですねぇ. 普通に考えれば「最小単位」が存在するでしょうから, 現れる数値を全て「最小単位」の整数倍にしちゃうのが安全じゃないでしょうか.
- sakusaker7
- ベストアンサー率62% (800/1280)
その現象はバグじゃありません。 とりあえずこの辺参照。 http://hp.vector.co.jp/authors/VA016119/excel/vbafaq01.html Excel VBA FAQ 入門編1 |Int(4.1 - 0.1) が 3 になる? | 実数の比較や丸めを、整数の場合と|同様の方法で行うと、期待する結果を得る|ことはできません。このことはExcelの |ワークシート上でも同様です。 | 基本的に、VBAでは実数は浮動小数点数型(Double、Single)で扱われます。 |浮動小数点数型では、ほとんどの10進小数を正確に表現することができません。 |4.1も0.1も浮動小数点数型には存在しません。近似値として扱われます。 |つまり、4.1の近似値-0.1の近似値=4の近似値となり、実際には4よりもわずかに小さな値になります。 |そのためInt関数で切り捨てると3になってしまいます。 対処法はいろいろありますが、どういう計算で この数値を扱うのか、差し支えなければ 補足してください。
補足
回答ありがとうございます システム:ショッピングカート my $data1 = "5"; #既存在庫数(データから取得) my $data2 = "4.9"; #顧客購入数(購入者が入力) my $data3 = "0"; #新規在庫数初期化 $data3 = $data1 - $data2; #新規在庫数計算(データに上書き) ちなみに在庫数は量り売りを考えているので(メール売りなど)、 小数点を許しているのです