• ベストアンサー

小数点の誤差をなくすのは可能?[ExcelとPHP]

PHPとExcelのワークシート関数を使って小数点の演算を行い、 両者が正しい値を返しているかを比較しているのですが、 どうしても計算が合いません。 例えば、次のような計算です(小数点は少数点以下第4位まで に統一されています)。 0.0034×0.2313×1.7423=?? PHPとExcelのそれぞれにおいて、小数点以下の計算に限界が あるのは、理解しました。 ということは、PHPとExcelで上記のような計算を正しく同じ値にするのは不可能なのでしょうか? それとも、PHPとExcelのそれぞれにおいて、ROUND関数などを駆使 すれば解決可能なのでしょうか? 演算の工夫で解決できる問題なのか、そもそも不可能な問題なのか を教えていただけたら幸いです。

  • ausk
  • お礼率16% (1/6)

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

  • ベストアンサー
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.1

10000倍して整数で計算してはどうでしょうか?

ausk
質問者

お礼

お礼が遅れて申し訳ありませんでした。 無事、10000倍することで解決しました。 それでもなお、少々の誤差がたまに出るようですが、 多少の誤差が出ても問題の出ないようなアルゴリズムに 改良したところ上手くいっています。

その他の回答 (3)

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.4

#1 について補足すると Excel, PHP ともに最新版は、整数の和差積に関しては64bit整数で計算されます。 したがって、signed 32bit -(2の31乗)~(2の31乗-1) を考慮する必要がありません。 なので単純に10000倍して計算するとよいと回答しました。 浮動小数点計算の場合は丸め誤差が発生します。 Excelの方が精度が高くなるはずです。 ここで議論しても始まらないので、まずはやってみてください。

回答No.3

単純に有効桁数の問題では? 32Bitの環境でしたらfloat型では有効桁数が7桁です。 これ以上の精度が必要でしたら任意精度数学関数をインストールすれば可能です。構築の方法はPHPのサイトで見つけてください。 有効桁数が10桁未満でしたら、#1さんのように整数化して計算する手法もよく使われています。

noname#182251
noname#182251
回答No.2

どうしても精度を上げたければVBAで多倍長計算できる関数を作れば可能でしょう。 na-inet.jp/nasoft/chap04.pdf http://www.vector.co.jp/vpack/filearea/win/prog/basic/ubasic/

関連するQ&A

  • エクセルの小数点を消す

    とある割合をかけて算出する計算式の答えが、小数点以下8ケタくらいの数字になりました。 ROUNDとかの関数を使えば、四捨五入されるのは知っていたのですが、それを忘れてしまったため、全ての答えに小数点以下の数字が入ってしまいました。 答えから、小数点以下を消したい(できれば四捨五入して)のですが、1コ1コ消していくのしかないのでしょうか??

  • 【PHP】printf()関数の小数点以下の扱い方

    printf()関数で以下のような記述をしました。 関数の引数を計算すると単純で 5 × (1 - 0.35) で結果は 3.25 となります。 これを$%.1f によって出力するため小数点以下は1桁です。 桁数を指定した場合、指定し桁数以下は「四捨五入」されると思っていました。 よって、自分では Price: 3.3 と出力されると考えていましたが 実際には Price: 3.2 と表示されます。 ちなみに 3.25 を round() 関数で使うと 3.3 と返ってきます。 printf()関数で小数点以下の桁数をしてした場合、四捨五入、切り上げ、切り捨て いずれでもない値が返ってくるのでしょうか? このような小数点以下の桁数を扱う方法はPHPの他の関数でも使われるのでしょうか? この方法の呼称というか名称というのはあるのでしょうか? 初学者です。分かりやすく教えていただければ幸いです。 よろしくお願いいたします。! <表示結果> Price: $3.2 3.3 <?php $price = 5; $off = 0.35; printf("Price: $%.1f", $price * (1 - $off)); echo "<br>\n"; echo "<br>\n"; echo round(3.25, 1); ?>

    • ベストアンサー
    • PHP
  • エクセルで小数点以下を切り捨てた答えを表示したい!

    こんにちは。宜しくお願いします。 OSは、WindowsNT、Excel97を使用しています。 エクセルで計算式を作った時、答えが小数点以下2ケタまで表示されたとします。それを小数点以下を切り捨てた数字で表示したい時、どうすればいいのか分かりません。 関数「ROUND DOWN」を使えば切り捨てが出来るという事は分かるのですが、出来れば、計算して答えが出るセルに直に切り捨てた答えが出るようにしたいのです。(つまり、小数点以下の答えが表示されるセルと、切り捨てた答えが表示されるセルを分けたくないのです) 拙い説明で申し訳有りませんが、不明な点などあれば補足致しますので、宜しくお願いします。

  • 小数点以下を強引に表示させたい

    小数点以下を強引に表示させたいと考えています。 具体的には、「130」という値を「130.00」というように、小数点以下2桁まで表示させたいのです。3桁以下は切り捨てます。 これまでは、 $c = $a / $b; round($c, 2); という方法でやっていたのですが、$cがきっちり割り切れる値だと、どうも普通に小数点以下を表示させないようなのです。 例え「00」でも表示させたいのですが、そのような関数はありますでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 小数点、指示がない場合、何位まで?

    先日2.7+3.26/(1.7)² – ³√20.7   ( (1.7)² – ³√20.7 分の2.7+3.26)  の問題について³√20.7の計算機を使っての答えの出し方がわからずこちらで質問させて頂きました。 親切な回答者から答えて頂き、計算機 で³√20.7=2.74572338.......と答えを出す事が出来る様になりました。 そしてこの問題の答えは41.3です。 ひととうりの計算をやってみて、改めて、疑問に思うところがあるので教えて頂きたいのですが、、 割り切れない場合、又それについて指示がない場合、小数点をどこまで出せばいいのかわかりません。 この問題の原文は(英文ですみません)Calculate: 2.7+3.26/(1.7)² – ³√20.7 and round to 1 decimal place. です。 2.7+3.26/(1.7)² – ³√20.7→5.96/2.89-2.74572338.......→5.96/0.14427622=41.309648..... で、答えは41.3となります。 しかし、この³√20.7=2.74572338を問題で特に指示が無い場合、小数点何位まで使うのか、という判断はどうやって決まるのですか? 答えに対してはround to 1 decimal place(小数点第一位まで)と指示がありますが、途中経過の計算に対しては何の指示もありません。 例えば³√20.7=2.74572338を少数2位までの2.75で計算するとします。 2.7+3.26/(1.7)² – ³√20.7→5.96/2.89-2.75→5.96/0.14=42.5714.....と答えは全く違ったものになります。 又、この問題とは異なりますが、テスト前に過去の問題を息子がやって同じ様な問題がある度に疑問に思ってます。 指示がない場合、少数点、どこまで答えればいいのか。 以前先生に息子が聞いた答えは少数第2位まで。 が、もうひとつ納得がいきません。 答えを出す場合小数点は何位まで出せばいいのか? 途中の計算で割り切れない場合、小数点は何位まで使えばいいのか? 何か決まりはあるのでしょうか? 非常にわかり難いかと思いますが、最後まで読んで頂いた方、有難うございます。 教えて頂ければ幸いです。

  • EXCELで「小数の入ったセル」だけを見つけたいのです

    EXCEL2000を用いて統計表を作成しています。 そのとき「1人あたり販売額」など小数点以下の値が出る項目があります。 今までは印刷物を納入していたため特に問題にはならなかったのですが、 発注先から「小数点以下はROUNDし、数式も全て値にしてから納入すべし」 との指示が来ました。 数式はコピー→形式を選択して貼り付け→値複写 でなくなりますが、 小数点以下の値が入っているセルを見つけるのがわずらわしくて困っています。 こうした場合、編集→ジャンプ 等、簡便な方法はないでしょうか。 ご存知の方、どうぞよろしくお願いいたします。

  • Excelで小数点以下の表示

    お世話になります。 分かる方がいましたら返信お願い致します。 Excelにて、テキストと数字の組み合わせによる表示の時、数字部分を小数点以下1桁に統一して表示したいのですが、うまくいきません。 例えばA1=5、とB1=1として(A1、B1は変数) C1にA1÷B1の答えを「答えは5.0」と表記したいのですが、 C1="答えは"&A1/B1 とすると「答えは5」となり、小数点以下1桁が表示されないです。 解決方法として考えたのが、書式設定で表示形式を小数点以下1桁に指定する、 またはROUND関数で小数点以下1桁に統一する方法ですが、 両方共「答えは5.0」ではなく「答えは5」となってしまいます。 またセルを2つ使ってC1に「答えは」、C2に「5.0」と表示なら可能ですが、 表の一部の為、見た目が崩れてしまって嫌です。 解決方法が分かる方がいましたら、よろしくお願い致します。

  • エクセルの小数点以下表示

    エクセルの小数点以下表示でツールバー、セルの書式設定などは表示されていない部分(例えば小数点以下2位までの表示なら3位以下の部分)は四捨五入されているのでしょうか?デフォルトの状態を知りたいのです。それの端数をROUND関数で調整しないと、計算結果等に支障は出ますか。

  • 小数点以下を5より大きいと切り上げる

    こんにちは エクセルで計算式を作っています。 計算結果の小数点以下を四捨五入して、整数にする場合は ROUND(計算式,0) となると思うのですが、 小数点以下が5より大きい場合に切り上げて、5ちょうどだった場合に切り捨てるには、どのようにすればよいでしょうか。 恐れ入りますが、よろしくお願いいたします。

  • わり算の結果が整数でも小数点以下4桁まで表示されてしまう!

    わり算の結果が整数でも小数点以下4桁まで表示されてしまう! 同じような質問で恐縮なのですが、 例えば、100、101というデータをMySQLの算術演算子/を使って2で割ると、 50.0000、50.5000のように、整数だろうが小数だろうが、小数点以下4桁まで出てしまいます。 これを、いろんな関数を駆使して50、50.5にすることはできますか。 50、51または50.0、50.5のように小数点の位置を同じずつ動かすことはできるのですが、これでは嫌だなぁと思った次第です

    • ベストアンサー
    • MySQL