• ベストアンサー

1以下になる数値計算

変数1+変数2-変数3の式で、 変数1と変数2を足して変数3を引いて 答えが1以下の場合 誤差がでるのですが 誤差を無くすにはどうすればいいでしょうか?

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

  • ベストアンサー
  • mii-japan
  • ベストアンサー率30% (874/2820)
回答No.7

>$point1 = "500.404"; >$point2 = "500.554"; >$point3 = "1000"; >$point = $point1+$point2-$point3; >print $point; >で表示内容が >0.95799999999997 変数が実数であれば至極当然の結果です(Excelでの計算でもほぼ同様の結果になります) 通常は、これを表示のみ、表示したい桁の1桁下で四捨五入して表示するよう設定します これはExcelではfaqです(と言うか実数を扱うコンピュータ技術者では常識です) 実数をどのような形式で保存し、計算・表示するかを学んでください

suiku
質問者

お礼

わかりました。

その他の回答 (7)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.8

まず、計算は間違っていません。内部ではこういう結果がでています。 #6の方の回答も0.958と表示されていますが、内部では、0.9579999...となっているのを小数点第四位を四捨五入して表示しているにすぎません。このあたりは、結果表示の考え方にもよります。 残念ながら、浮動小数点の演算というのはこういうものです。 浮動小数点というのが、単精度だと32ビットで表現できる範囲以上の数値を扱うためには仕方のないことです。 たとえば、1000000000.に0.1を加える場合、単精度だと桁落ちするので、何回加算しても答えは1000000000.のままです。 数値演算を手がける場合、このあたりを理解して誤差が出にくいような計算順序やデータ型を検討してください。 簡単な方法はやられたように固定小数点の範囲で演算できるようにすることですが、COBOLのように固定小数点で多桁の10進演算の出来るようなパッケージを使うこともよい方法です。

suiku
質問者

お礼

わかりました。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.6

補足にあった式をそのままコピペしましたが・・・・ ちゃんと0.958って表示されました PHPのバージョンによって処理が変わるかもしれませんね。 ご使用のPHPのバージョンはいくつでしょうか?

suiku
質問者

補足

http://www.tsukaeru.net/vps.phpを利用しており、 バージョンについては、以下と表示されています。 バージョン 4.3.2

  • likipon
  • ベストアンサー率38% (44/114)
回答No.5

詳細が不明なのはすでに指摘されているとおりですが, この手の誤差の例としてよく出る例としては近い数の引き算というのがあります. 今回の場合, (変数1 + 変数2) の値と変数3の値がかなり近い場合に, 有効桁数が 一気に小さくなってしまう場合があります. 特に後に別の式で値を使う時には困ることもあるかもしれません.

suiku
質問者

お礼

すみません。 すべて整数で保存し、 表示の際に、$point = $point/10000; をすることにしました。 これでプログラム組みますが誤った数字が出るかもしれませんので 一番いい方法があれば、教えてください(小数点以下は、4桁です) よろしくおねがいします。 今回は、迷惑をおかけしすみませんでした。

suiku
質問者

補足

1以下以外の場合は正しく表示しますが、 1以下の場合、最終の数字が1小さくその後ろが9が続いています。 質問者が使う桁数で小数点以下は最大4桁で最小0桁 0.5543になったり 1になったり 0.05になったりします。

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.4

最低限、変数の型が必要です。 加減算でわかるような誤差が出るとすると、原因はこの式以前だと思いますね。 なお、基本的には計算結果は全て切り捨てられ、浮動小数点は元々が近似値なで、誤差は当然あるということを理解しておいてくださいね。

suiku
質問者

お礼

すみません。 すべて整数で保存し、 表示の際に、$point = $point/10000; をすることにしました。 これでプログラム組みますが誤った数字が出るかもしれませんので 一番いい方法があれば、教えてください(小数点以下は、4桁です) よろしくおねがいします。 今回は、迷惑をおかけしすみませんでした。

suiku
質問者

補足

$point1 = "500.404"; $point2 = "500.554"; $point3 = "1000"; $point = $point1+$point2-$point3; print $point; で表示内容が 0.95799999999997 です。 数学関数がいまいちわかりませんので おかしい所などがありましたら指摘を お願いします。 No.1の人への補足にミスした個所がありました。 1000を100にしてしまいました。

回答No.3

No.1の人、厳しい一言ですが、ごもっともです。 質問者は、学生さんかな。 数値計算シミュレーションにおいて、計算誤差は稀に生じます。 大事なことは、その誤差が求めたい解の「有効桁数」よりも小さいかどうかを判断しなければいけません。 がんばってください。

suiku
質問者

お礼

すみません。 すべて整数で保存し、 表示の際に、$point = $point/10000; をすることにしました。 これでプログラム組みますが誤った数字が出るかもしれませんので 一番いい方法があれば、教えてください(小数点以下は、4桁です) よろしくおねがいします。 今回は、迷惑をおかけしすみませんでした。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

例をあげてもらえれば詳細もわかるかもしれません。 そもそもが変数の値に誤差があるんじゃないですか?

suiku
質問者

お礼

すみません。 すべて整数で保存し、 表示の際に、$point = $point/10000; をすることにしました。 これでプログラム組みますが誤った数字が出るかもしれませんので 一番いい方法があれば、教えてください(小数点以下は、4桁です) よろしくおねがいします。 今回は、迷惑をおかけしすみませんでした。

suiku
質問者

補足

計算機で確認しましたが 桁数も答えも違い 自分で計算してみましたが、 計算機と同じ数値です。

  • mii-japan
  • ベストアンサー率30% (874/2820)
回答No.1

質問の意味がわかりません、何を聞きたいのか具体的に示してください 各変数それぞれの値と答、質問者が要求する誤差の許容値等が明確でないと回答できません また 言語は? 変数は整数・実数・複素数 また精度(ビット数、表記方法)は? 実数・複素数の場合必ず誤差が発生します 質問者は判っていることでも、回答する者(読んだ者)には、書かれていること以外は全く判りません 他人に理解できるような質問ができないのは、SE・プログラマーにとっては致命的です

suiku
質問者

お礼

すみません。 すべて整数で保存し、 表示の際に、$point = $point/10000; をすることにしました。 これでプログラム組みますが誤った数字が出るかもしれませんので 一番いい方法があれば、教えてください(小数点以下は、4桁です) よろしくおねがいします。 今回は、迷惑をおかけしすみませんでした。

suiku
質問者

補足

>言語は? PHPのカテゴリにあるため、回答者にわかるとおもっていましたが そうではないみたいなのでスクリプト言語のPHPの質問です。 >変数は整数・実数・複素数 小数点以下が含まれている時があるため、 実数だと思います。 >精度(ビット数、表記方法) 精度については、わかりません。 $point1 = "500.404"; $point2 = "500.554"; $point3 = "100"; $point = $point1+$point2-$point3; の形式でしています。

関連するQ&A