- ベストアンサー
小数点の誤差をなくすのは可能?[ExcelとPHP]
PHPとExcelのワークシート関数を使って小数点の演算を行い、 両者が正しい値を返しているかを比較しているのですが、 どうしても計算が合いません。 例えば、次のような計算です(小数点は少数点以下第4位まで に統一されています)。 0.0034×0.2313×1.7423=?? PHPとExcelのそれぞれにおいて、小数点以下の計算に限界が あるのは、理解しました。 ということは、PHPとExcelで上記のような計算を正しく同じ値にするのは不可能なのでしょうか? それとも、PHPとExcelのそれぞれにおいて、ROUND関数などを駆使 すれば解決可能なのでしょうか? 演算の工夫で解決できる問題なのか、そもそも不可能な問題なのか を教えていただけたら幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
10000倍して整数で計算してはどうでしょうか?
その他の回答 (3)
- junkUser
- ベストアンサー率56% (218/384)
#1 について補足すると Excel, PHP ともに最新版は、整数の和差積に関しては64bit整数で計算されます。 したがって、signed 32bit -(2の31乗)~(2の31乗-1) を考慮する必要がありません。 なので単純に10000倍して計算するとよいと回答しました。 浮動小数点計算の場合は丸め誤差が発生します。 Excelの方が精度が高くなるはずです。 ここで議論しても始まらないので、まずはやってみてください。
- ChateauAres
- ベストアンサー率43% (64/148)
単純に有効桁数の問題では? 32Bitの環境でしたらfloat型では有効桁数が7桁です。 これ以上の精度が必要でしたら任意精度数学関数をインストールすれば可能です。構築の方法はPHPのサイトで見つけてください。 有効桁数が10桁未満でしたら、#1さんのように整数化して計算する手法もよく使われています。
どうしても精度を上げたければVBAで多倍長計算できる関数を作れば可能でしょう。 na-inet.jp/nasoft/chap04.pdf http://www.vector.co.jp/vpack/filearea/win/prog/basic/ubasic/
お礼
お礼が遅れて申し訳ありませんでした。 無事、10000倍することで解決しました。 それでもなお、少々の誤差がたまに出るようですが、 多少の誤差が出ても問題の出ないようなアルゴリズムに 改良したところ上手くいっています。