• 締切済み

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では浮動小数点の問題は解決できないのでしょうか? 便利なライブラリなどもないでしょうか?

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.1

そもそも本当に解決する必要があるのかが疑問です。 WindowsやAndroidやGoogle検索などの電卓も長い間その挙動を仕様としてきました。 昨今その挙動をバグと思う人からの指摘が盛り上がったため対策されましたが、 そこまで大体的に使われるのでもない電卓に労力を掛けて対策する意味があるとは思えません。 evalを使うという妥協、手抜きをしているのに、細かいところに拘るというのも理解不能ですし、 細かいところに拘って車輪の再発明をやりたがっているのに、便利なライブラリに頼ろうというのも不可思議です。 まぁやりようとしては、evalを使わず、桁を揃えた状態から小数点を取って整数として計算し、 その後小数点を適切に付けて表示するのが一番簡単でしょう。

mousugusokoni
質問者

お礼

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;

関連するQ&A

  • 浮動小数点について

    独学でプログラミングの勉強をしています。Wiki等で調べたりしましたが、 下記テキストの質問の計算が全く分かりません。 分かりやすく説明して頂けるとありがたいです。 宜しくお願い致します。 質問: 二つの浮動小数点の数字があり、SEEMMMM(S=符号付数値、E=指数、M=仮数)の形式で表示されています。 指数はエクセス数50、仮数は符号付数値、小数点は右の仮数に表示されます。 0 53 1110 0 50 3020 二つの数字を加算し、正しく表示された浮動小数点形式と実数をすべての計算式も含め表しなさい。

  • 浮動小数点について

    当方、浮動小数点を勉強しているのですが、 テキストの解説を読んでも理解が出来ません。 正規化とか指数と仮数の意味が分かりません。 そこで質問なのですが、浮動小数点の計算方法を教えて下さい。 IEEE形式の浮動小数点も教えて頂けると助かります。 また、下記の問題について解説して下さい。 数値を16ビットの浮動小数点表示法で表現する。 形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。 ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、 指数部を調節する操作である。 (図は添付します) 何故「E」の値が「1111」になるのでしょうか。 お手数ですが、ご教授お願いします。 尚、特に分かり易いホームページがあったら、 そのURLを記載して頂いても結構です。 以上、よろしくお願い致します。

  • 浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で最小値を求めるにはどういう計算をすればいいのでしょうか?また調べた数値だと最小値 1.175494351E-38 最大値3.402823466E+38のところ±3.40282347E+38 ~ ±1.40239846E-45のところがあるのですがどちらが正しいのでしょうか?

  • iアプリで浮動小数点を使いたい

    iアプリで確立を計算したいのですが、浮動小数点が使えないので困っています。 整数演算で浮動小数点を扱うクラスを自作するしかないのでしょうか? 使えそうなクラスなど、ご存知でしたら教えてください。

    • ベストアンサー
    • Java
  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

  • 浮動小数点の計算について

    Javaで0.1+0.2を計算すると0.30000000000000004になったり、10.0-9.9を計算すると、0.09999999999999964になったりするのはなぜですか? 参考書では。 「浮動小数点数を使った計算では、一見正確な値が計算されてるように見えてもほとんど場合内部では少しだけ誤差を含んだ値を持ってると、考えた方がいいでしょう。どのような計算を行った時にどの程度の誤差が出るのかは難しい話題になるのでこの本では詳しく説明しませんが、例えば100.0-99.99のように同じぐらいの数同士で引き算を行うと誤差が現れやすくなります。」 と書いてありました。 この本ではこれだけで説明が終わりました。 なぜ浮動小数点で計算を行うと誤差が出るのか詳しく教えていただけると助かります。

    • ベストアンサー
    • Java
  • 浮動小数点変換

    (1)次の数値をIEEE754単精度形式で正規化された浮動小数点に変換し、結果を8桁の16進数で表記しなさい。 (a)0.5 0.5を二進数で表すと0.1 0.1*2^0であるから 0 00000000 10000000000000000000000 (b)1.0 1.0を二進数で表すと1.0 0.1*2^1であるから 0 10000000 10000000000000000000000 (c)1.25 1.25を二進数で表すと1.010 0.101*2^1であるから 0 10000000 10100000000000000000000 浮動小数点への変換、あってますでしょうか? また結果を8桁の16進数で表記とありますが 0.5だったら16進数で表すと0.9?これを8桁*16^なんとか乗で表すということでしょうか?

  • 浮動小数点形式の問題

    数値を32ビット浮動小数点形式で表す。指数部は2を基数とし、負数は2の補数で表現する。10進数0.375をこの2を基数とした浮動小数点形式で正規化したものはどれか。ただし結果は16進数で表現する。 答え:7FC00000 という問題です。 まず0.375を2進数に 0.011 正規化 0.11 * 2^-1 指数部-1を2進数で求める -0000 0001 ->1111 1111 仮数部符号は正の数なので0 0111 1111 ???? ???? ???? ???? ???? ???? と・・・ ここの部分からわかりません・・・ (なぜか手持ちの参考書には省略してあり・・・) 7Fの部分はこれで間違いないでしょうか? またそのあとのC00000 はどうやって導くのか教えてください。 お願いいたします

  • 「浮動小数点表示」と「丸め」について

    数値解析についての質問です。 「23.49を有効数字4桁の浮動小数点表示で書け」という問題があるときは 0.2349 * 10^2 と答えるのが正しいのでしょうか。 つまり「浮動小数点表示で答えよ」とあれば、 0.○○○... * 10^○の形で書けば良いのでしょうか。 また、数値の丸めの仕方に関する質問なのですが、教科書に以下のような記述がありました。 k+1桁以降の数を切り捨てる a.この切り捨てられた数が第k桁の単位の半分より小さいときは、第k桁の数はそのままにする。 b.もし半分より多きときには第k桁の数に1を加える c.この切り捨てられた数が第k桁のちょうど半分のときには最も近い偶数に丸める とあるのですが、その後の記述で 「1.2535をそれぞれ小数点以下3桁、2桁、1桁で丸めると、1.254,1.25,1.3が得られる」また「小数第3位以下の情報なしで、1.25を1桁で丸めると1.2になる」とあるのですが、 後者が1.2になるのは理解できるのですが、最初の規則に則ると前者も1.2になるように思うのですが、何故1.3になるのでしょうか。 以上の規則に則った上で以下の問題に答えてみました。 問.-89.216618, 500000, -0.002213675を丸めて有効数字5桁の浮動小数点表示で書け 僕の答え -0.89217 * 10^2 0.50000 * 10^6 -0.22137 * 10^-2 というのは合っていますでしょうか。 質問が多くて大変恐縮ですが、解説、ご指摘をお願いします。 よろしくお願いします。

  • 32ビットの浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で非正規表現をもとめるには例えば(符号0指数0仮数1.01101)はどういう計算をすれば良いのでしょうか?

専門家に質問してみよう