小数の足し算における誤差の原因とは

このQ&Aのポイント
  • Javascriptを使用して小数の足し算を行った場合、一部の計算結果に誤差が生じることがあります。
  • この誤差は、浮動小数点数の内部表現の限界や計算の丸め誤差などが原因とされています。
  • 具体的には、0.1や0.05などの一部の小数を正確に表現することができず、計算結果にわずかな誤差が生じることがあります。
回答を見る
  • ベストアンサー

小数の足し算

Javascriptで <SCRIPT language="JavaScript"><!-- function wa() { a = eval( document.myFORM.a.value ); b = eval( document.myFORM.b.value ); s = a + b; document.myFORM.kotae.value="答え " + s; } //--></SCRIPT> </HEAD> <BODY> <FORM name="myFORM"> A =<INPUT type="text" name="a" size="3">B =<INPUT type="text" name="b" size="3"><BR> <INPUT type="text" name="kotae"><INPUT type="button" value="=" onclick="wa()"> </FORM> </BODY> としたとき A=0.1 B=0.05とすると 答え 0.15000000000000002となるのはなぜですか?

  • upnn
  • お礼率90% (10/11)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

Javascriptが内部処理に[浮動小数点]方式をを使っているからです。 [浮動小数点]は、近似値を答として出力するという特徴があります。 誤差が出るので、計算を繰り返すと、誤差は大きくなっていきます。 Javascriptが内部で、答えが 0.51 等と表示される場合でも、 内部処理を[浮動小数点]で行い「丸み」をつけている (小数点の表現を四捨五入のようにする)だけの場合が多いです。 誤差がなくなるわけではないので、 正確性を要する計算では、[固定小数点]をつかいます。 もっとも、自分で処理方法を考えなくてはならないので大変です。 2進数で小数を表現する場合[固定小数点](通常の小数)を使うと、 オーバーフローを起こしやすい(桁の小さい表現しかできない) という、決定的な欠点があります。 そのため、天文学の物理演算などの計算ができません。 なら、正確性よりも桁の多い計算ができたほうが… という理由で、 高等言語やスクリプトのほとんどが[固定小数点]をつかいます。 [浮動小数点]では、 テクニックによって誤差を少なくできる方法がいくつかありますので、 頑張ってみにつけてください。 参考[浮動小数点]↓ http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

upnn
質問者

お礼

返事遅れました。すいません 少し難しいですがなんとなくわかりました ありがとうございます

関連するQ&A

  • 配列の使い方

    JavaScript 初心者です。 下記ソースでinput type="text"でname="kazu1,name="kazu2"のように2個限定で使っているのですが将来的にDBから読んだ数分に変わる予定です。 その場合 eval(document.myForm.kazu1.value)+ の表現はどのように変えたらいいでしょうか。 配列の数はi7で持ってきています。 <script language="JavaScript"><!-- function ttlValue(i7){ goukei = eval(document.myForm.kazu1.value)+eval(document.myForm.kazu2.value); alert("sum "+goukei+"です"); } // --></script> </head> <table border=1> <tr> <td width="40%" ><input type="text" name="kazu1" value="10">%</td> <td width="40%" ><input type="text" name="kazu2" value="10">%</td> </tr> <tr> <td><input type="submit" name="button" value="keisan" onClick="ttlValue(2)" ></td> <td></td> </tr> </table> </form>

  • テキストボックスの値で配列の値を求めるには?

    やりたいと思っているのは、 (1) "INPUT" の値を入力。 (2) "koteichi" は他からの参照値。 (3) "goukei"に(1)と(2)の合計値。 (4) "total" に(3)の値に該当する配列の値。 (実際には配列の値を代入した式の答え。) という流れになります。 (3)まではなんとか分かるのですが、 (4)はどのように配列の値を代入すればいいのかが 分かりません。  なにぶん最近始めた初心者なので不規則な値は配列を使えばいいと解釈したのですが、まったく使い方を間違えているのでしょうか? こういった場合は別のやり方があるのでしょうか? どなたかよろしくお願いします。 <SCRIPT language=JavaScript1.1> <!-- rank = new Array(6); rank[0]=0; rank[1]=5;[rank2]=8;[rank3]=12;rank[4]=16;rank[5]=22; function calc(){ document.myform.goukei.innerText = eval(document.myform.INPUT.value) +eval(document.myform.koteichi.value); } // --> </SCRIPT> </HEAD> <BODY> <form name="myform"> <INPUT size="20" type="text" name="INPUT" value="0" onchange="calc()"/>+<INPUT size="20" type="text" name="koteichi" value="10">=<INPUT size="20" type="text" name="goukei" value="0"> <INPUT size="20" type="text" name="total" value="0"> </FORM> </BODY>

  • JavaScriptの計算式を添削してください。

    250×変数A+200×変数B+150×変数C=合計という 計算をしたくて過去の質問をヒントに自分なりに工夫して 作成いたしました。(JavaScriptは超初心者) 変数A~Bには整数が入ります。 自分で動作を確認したところ問題無く動くようですが、 何か問題がないか心配です。 これでいいのか、間違っているところがないか 確認願いますでしょうか。 <HTML> <HEAD> <SCRIPT language="JavaScript"> <!-- function calc() { document.f.t4.value = eval(250) * eval(document.f.t1.value)+eval(200) * eval(document.f.t2.value)+eval(150) * eval(document.f.t3.value); return true; } //--> </SCRIPT> <TITLE></TITLE> </HEAD> <BODY> <FORM name="f"><INPUT type="text" name="t1" onkeyup="calc()" value="0"><INPUT type="text" name="t2" onkeyup="calc()" value="0"><INPUT type="text" name="t3" onkeyup="calc()" value="0"> = <INPUT type="text" name="t4"></FORM> </BODY> </HTML>

  • JavaScriptでの足し算処理について

    本日よりJavaScriptに取り組んでいますが、いきなり足し算の処理でつまずきました。 下記の様にdeta1に10を入れ、計算ボタンを押すとdeta2に25が入るような処理を行いたいのですが、10が文字として認識されてしまうらしく、deta2が1015になってしまいます。 かなり基本的なことだと思いますが、どうすればよいか教えてください。 <script language="JavaScript"> <!-- function func1(){ document.test.deta2.value=document.test.deta1.value+15; } //--> </script> <form name=test> <INPUT type="text" name="deta1"> <INPUT type=button value="計算" onClick=func1()> <INPUT type="text" name="deta2"> </form>

  • for文の使い方について

    こんばんはpiyottiと申します。 forループを使用してtextの値を取得したいと思っています。 「document.myFORM.namei・・・」の「i」をループカウンターとして 「name1、name2・・・」と増やしていきたいのですがうまくいきません。 どうかよろしくお願いいたします。 <script Language="JavaScript"><!-- function calc(form) { n = 0; for (i=0; i<4; i= i+;) n += eval(document.myFORM.namei.value); } // --></script> <form name="myFORM"> 数値1:<input type="text" onChange="calc(this.form, this)" name="name1"> 数値2:<input type="text" onChange="calc(this.form, this) name="name2"> 数値3:<input type="text" onChange="calc(this.form, this) name="name3"> 数値4:<input type="text" onChange="calc(this.form, this) name="name4"><br> </form>

  • Javaで小数点第4までを処理したい。

    現在近似曲線を算出するプログラムを自作しています。 正確に算出するところまでは到達出来たのですが、最後に小数点以下が多すぎるので、小数点第四までに抑えたいです。 しかし、小数点を処理するようなプログラムを想定していなかったので、とても困惑しております。 私が作っているプログラムはこんな感じです。 <title>近似曲線プログラム</title> <body> <form name="Form1"> <font color="red">近似曲線用プログラム</font><br><br> ・X=<input type= "text" size="11" name="a"><input type= "text" size="11" name="b"><input type= "text" size="11" name="c"><br> ・Y=<input type= "text" size="11" name="e"><input type= "text" size="11" name="f"><input type= "text" size="11" name="g"><br>    <input type= "button" value= "近似曲線の数式を算出" onclick="keisan1()"><br><br> ・標本数=3<br><br> ・Xの平均値=<input type= "text" size="11" name="i"><br> ・Yの平均値=<input type= "text" size="11" name="j"><br><br> ・ΣXi<sup>2</sup>=<input type= "text" size="11" name="k"><br> ・ΣXiYi=<input type= "text" size="11" name="l"><br><br> ・a=<input type= "text" size="11" name="m"><br> ・b=<input type= "text" size="11" name="n"><br><br> 結果<br> ・y=<input type= "text" size="11" name="o">x+<input type= "text" size="11" name="p"> </form> <script language="JavaScript"> function keisan1(){ a = document.Form1.a.value-0; b = document.Form1.b.value-0; c = document.Form1.c.value-0; e = document.Form1.e.value-0; f = document.Form1.f.value-0; g = document.Form1.g.value-0; i=(a+b+c)/3; j=(e+f+g)/3; k=(a*a)+(b*b)+(c*c); l=(a*e)+(b*f)+(c*g); m=(l-3*i*j)/(k-3*(i*i)); n=j-m*i; o=m; p=n; document.Form1.i.value = i; document.Form1.j.value = j; document.Form1.k.value = k; document.Form1.l.value = l; document.Form1.m.value = m; document.Form1.n.value = n; document.Form1.o.value = o; document.Form1.p.value = p; } </script> </body> この中で、結果のoとpの部分を、小数点第四にまでに抑えたいのです、今現在では、小数点以下が10ケタ以上普通に出てしまいます。どちらも四ケタに抑えたいので、このプログラムに導入出来るような小数点処理のプログラムを知っている方がいらっしゃれば、是非丁寧に教えてほしいです。 よろしくお願いします。

  • 同じFunctionで、同じ計算させたいのですが

    私は今、以下のようにここで教えていただいたプログラムを参考に組んでは見たものの、同じ行をいくつもコピペすると計算されなくなってしまいます。1行だけの計算でしようとするとうまく計算されるのですが・・・ <HTML> <HEAD> <TITLE> タイトルバーに表示されるテキスト </TITLE> <SCRIPT LANGUAGE="JavaScript"> <!--JavaScript function SUM(){ if(!isNaN(document.sum.text1.value) && !isNaN(document.sum.text2.value) && !isNaN(document.sum.text3.value) && document.sum.text1.value && document.sum.text2.value && document.sum.text3.value){ document.sum.text4.value = eval(document.sum.text1.value) + eval(document.sum.text2.value) - eval(document.sum.text3.value) } if( !isNaN(document.sum.text5.value) && !isNaN(document.sum.text6.value) && document.sum.text5.value && document.sum.text6.value){ document.sum.text7.value = eval(document.sum.text4.value) + eval(document.sum.text5.value) + eval(document.sum.tex6.value) } } //--> </SCRIPT> </HEAD> <BODY> <FORM NAME="sum" onSubmit="SUM();return false;"> A<INPUT TYPE="text" NAME="text1" onChange="SUM()" SIZE="10"><BR> B<INPUT TYPE="text" NAME="text2" onChange="SUM()" SIZE="10"><BR> C<INPUT TYPE="text" NAME="text3" onChange="SUM()" SIZE="10"><BR> D=A+B-C<INPUT TYPE="text" NAME="text4" onChange="SUM()" SIZE="10"><BR> E<INPUT TYPE="text" NAME="text5" onChange="SUM()" SIZE="10"><BR> F<INPUT TYPE="text" NAME="text6" onChange="SUM()" SIZE="10"><BR> G=D+E+F<INPUT TYPE="text" NAME="text7" onChange="SUM()" SIZE="10"><BR> </FORM> </BODY> </HTML>

  • 複数のvalue値を返すには

    Aを選択した時10、Bを選択した時100、Cなら1000と <input type="text" name="TEXT" value="">に表示されるように以下のようなjavascriptを記述しましたが、 Aの時10と20を、Bの時100と200、Cの時1000と2000が もうひとつの<input type="text" name="TEXT2" value="">に表示できるようにするにはどうしたらよいのでしょうか。 記述方法を教えていただければ一番いいのですが、サンプルがあるページでもいいので、教えてください。 <script type="text/javascript"> <!-- function kai(){ document.FORM.TEXT.value = document.FORM.num.value; } //--> </script> </head> <body> <form name="FORM"> <input type="text" name="TEXT" value=""> <select name="num" onChange="kai()"> <option value="10">A</option> <option value="100">B</option> <option value="1000">C</option> </select> </form>

  • 複数の入力欄についての入力チェック

    JAVAScriptを勉強し始めたものです。 よろしくお願いします。 1つのページに複数のフォームと入力欄があります。 それぞれの入力欄は数字を入力することになっていて、その数字が1~90の間にあるかどうかをチェックしたいと考えています。 下記のようなページを見ると、一つ一つの入力欄について、IF文でチェックしているのですが、一括してチェックするようなことは可能ですか? http://www.tagindex.com/javascript/form/check1.html ----------------------------------------- 【以下に、やりたいことの例を示します】 <script type="text/javascript"> <!-- function matchNum() { n=eval(document.myFORM1.myTEXT1.value); // ←この行の「myFORM1」と「myTEXT1」をすべてを網羅するように書き換えられないか? if ( n < 1 || n > 90 ) { alert("入力できるのは、1~90の値です。"); } } // --> </script> <FORM METHOD="GET" name="myFORM1"> <INPUT TYPE="text" NAME="myTEXT1" onblur="matchNum()"> <INPUT TYPE="text" NAME="myTEXT2" onblur="matchNum()"> <INPUT TYPE="text" NAME="myTEXT3" onblur="matchNum()"> </FORM> <br> <FORM METHOD="GET" name="myFORM2"> <INPUT TYPE="text" NAME="yourTEXT1" onblur="matchNum()"> <INPUT TYPE="text" NAME="yourTEXT2" onblur="matchNum()"> <INPUT TYPE="text" NAME="yourTEXT3" onblur="matchNum()"> </FORM> <br> <FORM METHOD="GET" name="myFORM3"> <INPUT TYPE="text" NAME="hisTEXT1" onblur="matchNum()"> <INPUT TYPE="text" NAME="hisTEXT2" onblur="matchNum()"> <INPUT TYPE="text" NAME="hisTEXT3" onblur="matchNum()"> </FORM> <br> <FORM METHOD="GET" name="myFORM4"> <INPUT TYPE="text" NAME="herTEXT1" onblur="matchNum()"> <INPUT TYPE="text" NAME="herTEXT2" onblur="matchNum()"> <INPUT TYPE="text" NAME="herTEXT3" onblur="matchNum()"> </FORM>

  • 超初心者です。buttonをselectに変えるには?

    <SCRIPT language="JavaScript"> function calc1(){document.keisan.Z.value=eval(document.keisan.X.value)*1;} function calc2(){document.keisan.Z.value=eval(document.keisan.X.value)*2;} function calc3(){document.keisan.Z.value=eval(document.keisan.X.value)*3;} </SCRIPT> </head> <FORM name="keisan" > <INPUT type="text" name="X" size="4"> <INPUT type="text" name="Z" size="6"> <INPUT type="button" value="1" onClick="calc1()"> <INPUT type="button" value="2" onClick="calc2()"> <INPUT type="button" value="3" onClick="calc3()"> <INPUT type="reset" value="やりなおし"> </FORM> これの INPUT type="button"を<select>~<select> に変えたいと思っています。 自分の頭ではいろいろやってもうまくいきませんでした。 どなたか御教授を宜しくお願い致します。

専門家に質問してみよう