質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

1377閲覧

【PHP】少数の計算誤差の解決方法(BCMathの小数点以下の桁数指定)

u1men

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2018/10/07 00:41

編集2022/01/12 10:55

勉強のため、PHPで簡易的な電卓を作成しております。

$message = "waiting for user input"; if($_SERVER["REQUEST_METHOD"] == "POST"){ /* parse user input */ $value1 = $_POST['value1']; $value2 = $_POST['value2']; $operator = $_POST['operator']; $error; if( empty( $value1 ) || empty( $value2 ) ) { $error = 'plese input calc value!'; } else if( !is_numeric( $value1 ) || !is_numeric( $value2 ) ) { $error = 'your input is no numeric...'; } if(isset($error)){ $message = $error; }else{ /* calculate answer */ $answer=''; if ($operator == "+") { $answer = $value1 + $value2; } else if ($operator == "-") { $answer = $value1 - $value2; } else if ($operator == "*") { $answer = $value1 * $value2; } else if ($operator == "/") { $answer = $value1 / $value2; } /* generate message for user */ $message = sprintf("%s %s %s = %s", $value1, $operator, $value2, $answer); } } ?> <html lang="ja"> <head> <title>Simple Calculator | LastRoots</title> </head> <body> <h1>Simple Calculator</h1> <!-- Define form area to input numbers and select operator --> <h2>Input numbers and select operator</h2> <div id="formArea"> <form name="form" method="post"> <input type="text" name="value1" size="5"> <select name="operator"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> <input type="text" name="value2" size="5"> <input type="submit" value="calculate"> </form> </div> <!-- Display Answer --> <h2>Your Answer</h2> <div id="answerArea"> <?= $message ?> </div> </body> </html>

2つの入力値の四則演算結果を表示させる単純なものなのですが、テストを行う中で以下のような事象が発生しました。

100 - 99.6 = 0.40000000000001

調査したところ、少数の場合は誤差に注意が必要で、
BCMath 任意精度数学関数を使用するという情報をみつけました。
BCMathには引数として「小数点以下の桁数を指定」を指定せねばなりませんが、
これは電卓の場合は計算する2つの入力値により変わるものだと思いますので、
どのように設定すべきか悩んでおります。

一般的な電卓のような計算結果が得られるよう、
BCMatchを使う使わないに限らず、良案が御座いましたら教えて頂けないでしょうか。
宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/10/07 06:19

タイトルは質問内容の要件部分に寄った内容にしてください。このままだと同タイトル別要件で続いてしまいます
guest

回答2

0

php

1 $value1 = $_POST['value1']; 2 $value2 = $_POST['value2'];

の部分を

php

1 $value1 = (float)$_POST['value1']; 2 $value2 = (float)$_POST['value2'];

とでも、型キャストすれば実数として計算に使われるでしょう。
また、

php

1 } else if ($operator == "/") { 2 $answer = $value1 / $value2;

の部分もゼロ除算のエラーになり得るので、

php

1 } else if ($operator == "/") { 2       if ($value2 == 0) $answer = "分母が0なので、計算できません。"; 3 else $answer = $value1 / $value2;

等のエラー処置が必要でしょう。

投稿2018/10/07 00:53

seastar3

総合スコア2285

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

u1men

2018/10/07 01:00

早速のご回答ありがとうございました! 実はキャストについてはすでに試しておりまして、残念ながら結果は変わりませんでした... ゼロ除算についてはごもっともです。ご助言通り追加いたしますね!
seastar3

2018/10/07 04:31

では結果オーライということで、10万倍して整数計算し、10万で割ってみますか。
guest

0

  • 桁数の指定方法についての提案的回答
  1. 電卓の最大桁とする

例えば12桁電卓なのであれば、表示上小数部分が3桁しか表示できないとしても(整数部分が9桁ある)、BCMathの計算では12桁とする。
0. 演算によって求める
四則演算などやろうとしていることから考えると整数部分が最大何桁になるかは計算前におおよそ判別がつきます。例えば加算であれば、大きいほうの数の整数桁+1にしかならないとか、減算であれば、大きいほうの数の整数桁が最大であるとか、乗算であれば両方の数の整数部分の桁数の和を越えないとか。なので、電卓の最大桁に対して、整数部分の桁を推論して、小数部分の桁数を定めることができると思います。

投稿2018/10/09 06:40

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問