- 締切済み
JavaScriptの演算精度
同じような質問を続けて申し訳ありません。 r = <任意の数式>; x = Math.round(r*100000000000000)/100000000000000; とした場合、JavaScriptではxはどの数値の範囲で保証されていることになりますか? 2.2-2=0.2にしたいためのハックなのですが、どこまで精度が保証されているかわからないので宜しくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- b0a0a
- ベストアンサー率49% (156/313)
数値を文字列で扱って四則演算するロジックを書けば何兆桁でも正確に計算出来ます 例えば String.prototype.add=function (b){ var a=this,c="",i,n,m=0,ab ab=a.length-b.length if(ab>0){b=(new Array(1+ab)).join("0")+b} if(ab<0){a=(new Array(1-ab)).join("0")+a} for(i=a.length-1;i>=0;i--){ n=(a[i]-0)+(b[i]-0)+m m=n/10|0 n=n%10 c=n+c } if(m){c=m+c} return c } r="12".add("999").add("78")//12+999+78=1089 alert(r) みたいな感じで 自分で書かなくても便利なライブラリもありますよ
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 >約15桁くらいまでであれば正確に表せるということですね。 2の冪乗の和で表せる数値の中で、53bit(十進15桁)の有効数値の物だけです。十進の0.1とかはだめ。 電卓を作りたいならすべて整数で計算することです。小数点の位置合わせは自分でする。 整数はすべて「2の冪乗の和」なので正確に表せます。 例: "2.5" + "0.22" =? まずは文字列として扱い、小数点以下の桁数を合わせる。 "2.50" + "0.22" =? 小数点を取って、数値化する。 250 + 022 = 272 結果を文字列化する。 "272" さっきの小数点以下の桁数の場所に "." を挿入 "2.72" かけ算割り算も、筆算でやるときは小数点を一度忘れて整数と思って計算して、あとで小数点をつけると思いますが、その要領でやります。 8桁電卓なら、15桁あれば十分のはず。
- jjon-com
- ベストアンサー率61% (1599/2592)
> 二進で53桁(52+1)、十進に直すと約15.95桁 の実例はこちら。 http://okwave.jp/qa/q7461149.html の私の回答ANo.4 Javaのサンプルコードですけれど,IEEE 754の64bit倍精度 形式であることは変わりません. http://ja.wikipedia.org/wiki/IEEE_754
お礼
こちらもありがとうございます。 IEEE 754の仕様などがよくわかりました。 やはり、妥当な桁で四捨五入を行うことにします。 ありがとうございました。
- misawajp
- ベストアンサー率24% (918/3743)
>2.2-2=0.2にしたいため・・・ 非常に困難です、 *近似のために許容範囲を設定するか *小数を使用しないロジック(整数だけしか使用しない)を考案する必要が有ります 小数点以下の数値は 1/2,1/4,1/8・・・1/2^n の和で保存されています 0.2 は 0.125(1/8)+0.0625(1/16)+0.0078125(1/128)+・・・ で表されます、何桁とっても0.2になることはありません
お礼
電卓を作成しているため、小数を使用しないロジックは組めません。 どうしても割り算で小数が発生してしまいます。 最後の最後まで分数計算を行い、最後にまとめて小数化するのが一番理想なのかもしれませんが、かなり難易度が高いので今回はやめておきます。 何桁とっても0.2にならないのですね。 難しいですけど10進コンピュータがあると便利ですね。計算以外では無駄ですが。
- notnot
- ベストアンサー率47% (4900/10358)
二進で53桁(52+1)、十進に直すと約15.95桁です。
お礼
ストレートな回答有り難うございます! ということは、約15桁くらいまでであれば正確に表せるということですね。
補足
整数に変換して計算することも考えたのですが、割り算が無理でした。 123/456を整数で計算しても、答えが「0.26973684210526315789473684210526…」であるため、整数でも桁が溢れてしまいます。 これは対処法があるのですか?