勉強のため、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を使う使わないに限らず、良案が御座いましたら教えて頂けないでしょうか。
宜しくお願いいたします。