- 締切済み
javascriptで浮動小数点の問題
javascriptで浮動小数点の問題を解決しつつevalをつかった電卓を作ることはできませんか? >>> //-が欲しい場合 var array2 = str.match(/-?[0-9]+\.?[0-9]*/g); for(var i = 0; i < array2.length; i++) { console.log(parseFloat(array2[i])); } な感じで数値を抜き出し 計算記号+-*/に従ってmathのメソッドを順次呼び出す関数を作成すればいいのです。 計算記号については抜き出した数値を文字列として数えれば抜き出せるはず。 このように教えてもらいましたが、正直難しすぎてさっぱりわかりません。 evalでは浮動小数点の問題は解決できないのでしょうか? 便利なライブラリなどもないでしょうか?
- みんなの回答 (21)
- 専門家の回答
みんなの回答
- b0a0a
- ベストアンサー率49% (156/313)
回答No.1
そもそも本当に解決する必要があるのかが疑問です。 WindowsやAndroidやGoogle検索などの電卓も長い間その挙動を仕様としてきました。 昨今その挙動をバグと思う人からの指摘が盛り上がったため対策されましたが、 そこまで大体的に使われるのでもない電卓に労力を掛けて対策する意味があるとは思えません。 evalを使うという妥協、手抜きをしているのに、細かいところに拘るというのも理解不能ですし、 細かいところに拘って車輪の再発明をやりたがっているのに、便利なライブラリに頼ろうというのも不可思議です。 まぁやりようとしては、evalを使わず、桁を揃えた状態から小数点を取って整数として計算し、 その後小数点を適切に付けて表示するのが一番簡単でしょう。
お礼
Googlの公式の電卓でさえ最近まで浮動小数点の問題は、放置していたのですね。 それなら消費税関連の計算などがものすごい小数点の数値がドバーと出てきてもゆうざーさんはさほど気にしないと考えてよいのでしょうか? 今はとりあえず小数点の数値はすべて四捨五入しています、 これでも9割以上の人は小数点の数値にこだわる計算はしないので最悪これでもいいかと思っています。 それとも勝手に四捨五入しないで浮動小数点の問題はそのままのほうがましなのでしょうか? 恐らく https://qiita.com/k_moto/items/0b576a3351b77fb0aa98 の下記の部分を自分の計算に導入するのが一番でしょうか? ただevalでも可能なんですかね? 数値を文字列に変換して小数点を取り除く (1)でうまくいかないのは、整数値に変換するときに計算をしているからなので、 文字列操作で整数にしてしまいます。 まず、小数点の位置をさぐるメソッドを作ります。 function getDotPosition(value){ // 数値のままだと操作できないので文字列化する var strVal = String(value); var dotPosition = 0; // 小数点が存在するか確認 if(strVal.lastIndexOf('.') === -1){ // 小数点があったら位置を取得 dotPosition = (strVal.length-1) - strVal.lastIndexOf('.'); } return dotPosition; } 次に実際に計算するメソッドを作ります。 function calcSubtract(value1,value2){ // それぞれの小数点の位置を取得 var dotPosition1 = getDotPosition(value1); var dotPosition2 = getDotPosition(value2); // 位置の値が大きい方(小数点以下の位が多い方)の位置を取得 var max = Math.max(dotPosition1,dotPosition2); // 大きい方に小数の桁を合わせて文字列化、 // 小数点を除いて整数の値にする var intValue1 = parseInt((value1.toFixed(max) + '').replace('.', '')); var intValue2 = parseInt((value2.toFixed(max) + '').replace('.', '')); // 10^N の値を計算 var power = Math.pow(10,max); // 整数値で引き算した後に10^Nで割る return (intValue1-intValue2) / power;