少数計算の誤差について

このQ&Aのポイント
  • javascriptでの少数計算結果に誤差が生じる理由と、回避方法について説明します。
  • javascriptの仕様により、少数計算に誤差が生じることがあります。
  • 整数にしてから計算し、結果を元の少数に戻す方法を用いることで、誤差を回避することができます。
回答を見る
  • ベストアンサー

少数計算の誤差について

お世話になってます。 javascriptでの少数計算結果について、 document.write(1100 * 93.07);  ⇒102376.99999999999 document.write(1100 * 93.17);  ⇒102487 document.write(1100 * 93.57);  ⇒102926.99999999999 上記のような結果になるのですが、法則が分からず悩んでいます。 javascriptの仕様のようで、整数にしてから割り戻す方法で回避しようと考えてますが 結果に誤差がでる組み合わせの法則はどのようになっているのでしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1
gookyuu
質問者

お礼

早速の回答、ありがとうございます。 原因と法則性を見極めるのは、かなり大変そうですね。。 やはり整数にしてから割り戻すことにします。 (少数部は桁固定ですので。)

関連するQ&A

  • 丸め誤差への対処法についての疑問

    丸め誤差についてですが、 浮動小数点数の内部表現は2進数である為、循環小数となる「0.1」等を含んだ計算結果は誤差が 生じる事が多く、その対策として「整数にしてから計算し、その後割り戻す」 というのをよく目にします。 例えば、javascriptで行う下記のような計算です。 (1)0.1×6=0.6000・・・01 ※誤差が出る (2)0.1×10×6=6 ※整数にしてから計算 (3)(0.1×10×6)/10=0.6 ※割り戻す この時、(2)の「0.1×10」の箇所で誤差が生じないのは何故でしょうか? 「0.1」という数字自体が2進数に変換した時既に誤差が生じているのであれば、 誤差が生じている数字に10を掛けてもやはり誤差が残ってしまう気がするのですが。 また、(3)の割り戻し処理では結果が少数となりますが、この時に誤差が生じる事はないのでしょうか?

  • 誤差を出さずに整数計算をしたいです

    いつもお世話になっております。 0~18446744073709551615までの整数値を計算して出力するプログラムを作成しております。 しかし、計算に誤差が出てしまい意図した出力結果が得られません。 試してみた方法と出力は以下のとおりです。 ---------------------------------------------------------------------- [方法1] /* 18446744073709551615に0.0~1.0までの乗算 */ #define RANGE_MAX 18446744073709551615ULL #define MAGNIFICATION 1.0 /* 0.0から1.0 */ printf("%0.lf", RANGE_MAX * MAGNIFICATION); [出力1] 0~18446744073709552000 ---------------------------------------------------------------------- [方法2] /* 562949953421311に0.0~1.0までの乗算した結果と 562949953421312に0.0~1.0までの乗算した結果を 32767回加算した結果を加算する */ #define RANGE_MAX 562949953421312ULL #define MAGNIFICATION 1.0 /* 0.0から1.0 */ #define CYCLE 32767 unsigned long long int y = (RANGE_MAX - 1) * MAGNIFICATION; int loop; for(loop = 0; loop < CYCLE; loop++){ y += RANGE_MAX * MAGNIFICATION; } printf("%llu \n", y); [出力2] 0~9223372036854775808 ---------------------------------------------------------------------- 方法1は丸め誤差が原因だと考え方法2を試してみました。 しかし、方法2では情報落ちになってしまうのか、途中から計算されない 模様です。 誤差を出さずに計算によって0~18446744073709551615までの整数を 得るにはどのようにすれば良いのかご教授願います。

  • 計算機における誤差

    学校の実験で計算機における計算誤差の解析を行っています(丸め誤差など)。 計算機によって出力された計算結果の数字がどこまで有効であるか、計算機によって生じる最大誤差を知ることは、真の値を知っていない限り大変だと思います。そこで計算結果に対する信頼性を調べるためにどのような方法をとればよいと思いますか? 実行環境はWindowsXP,C言語で行っています。

  • 数値計算と文字列

    JavaScript 数値計算の式と値を表示させたいです。 10+5=15 document.write("10+5"+10+5);というのを関数で表わせないでしょうか? function foo(計算式){ document.write(計算式の文字列+計算結果); } 1+4-15など2つ以上の数値も対応したいです。

  • dounle型で計算時の誤差

    今、VC++(MFC)で、15桁の数値まで表示可能な電卓アプリを作成しています。 そこで今つまずいているのが、double型で計算したとき(演算結果が小数の場合)の誤差の問題です。 とりあえず、いろいろなHPなどの情報を見たりして、誤差問題解決を下記のようにしました。 「数値の頭(左側)から16桁目を四捨五入する」 小数の場合はほとんど誤差が生じるため、計算後、計算結果が小数ならば、必ず 上記の誤差処理を行っています。 しかしこれでは、以下の場合に不具合が出てしまいます。 ・ 0.99 999 999 999 999 ÷ 10 = 本来の答えは「0.09 999 999 999 999 9」 ⇒ しかし15桁までの表示なので、本来は「0.09 999 999 999 999」と15桁まで出力     させなくてはいけないのに、16桁目の「9」を四捨五入したせいで「0.1」という表示に     なってしまう。 16桁目を四捨五入しないと誤差をとることはできないし、でも上記の例だと正しい結果 が出力されません。 どうしたらいいのか頭を悩ませています。 何か良い解決法等あれば、ご教授お願いします!!

  • Perl:計算誤差について

    お世話になります。 Perlを使って、計算機には誤差があるという話をしようと思って、  print "1/3*3=", 1/3*3, "\n"; というプログラムを実行させました。 自分としては、1/3の時点で0.333333333333的な数になるので、それを3倍すると、0.9999999999的な数字になると思いましたが、結果としては1になります。 これはどういう原理でしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 給与計算をしています.誤差が出るのですが。

    給与計算をしていて、1円の誤差が生じました. 「オプション」⇒「計算方法」⇒「表示桁数で計算する」で、 当面はしのいでいますが、この方法でいいのでしょうか?小数点以下の指定や、表示形式などできる限りのことはしたつもりですが、上記の方法以外には解決策が見つけられませんでした.どなたか、お力を!

  • エクセル ROUNDDOWN関数の誤差

    給与の計算をエクセルで行っているのですが、誤差が出て困っています。 A1に出勤時間(17:00)、B1に退勤時間(18:00)、C1に勤務時間を計算するため(B1-A1)*24、D1に時給(100)、E1にROUNDDOWN(C1*D1,0)で答えが99になってしまいます。 色々他の値でも試してみたのですが、全ての時給、勤務時間で誤差が出る訳ではなく、時給が600円や700円の場合に誤差が出たり、勤務が15時から16時でも誤差が出たりします。どのような法則で誤差が出るのか全くわからず、修正方法もわかりません。 どなたか良い解決方法がお分かりでしたら教えていただけませんでしょうか? そもそもこのような場合に上記のような計算式を使用するのが間違いであればそれもご指摘ください。 よろしくお願いします。

  • Excelでの少数表示

    いつもお世話になってます。 Excelで表示形式は数値のまま少数を表示させたいのですが 小数桁が2にしてしてあるのに、少数部が1桁しか表示 されないことがあります。 どうやら整数部の桁数が多くなるときに、その現象が 起こるようなのですが、解決策はありますか? セルに式を埋め込んでいる場所があるので、表示形式を 文字列にしたくはありません。 表示形式を文字列にしても、セルに埋め込んだ式が正しく 計算される方法があるのならそれでも構いません。 よろしくお願いします。

  • 交通費計算の誤差について

    複数の車に乗車して旅行に行ったので、交通費の精算をしていました ところが、交通費の総額と、車を出してくれた人に支払う費用の合計で、誤差が生じてしまい非常に困っています 計算に当たっての情報は以下の通りです A車 燃費 15キロ/リットル B車 燃費 5キロ/リットル ガソリン代 143円/リットル 走行距離 56キロ 1.トータルの交通費の算出 ・計算式   A車の燃費 15キロ/リットル + B車の燃費 5キロ/リットル ÷ 2台 = 2台の車の平均燃費 10キロ/リットル  走行距離 56キロ ÷ 2台の車の平均燃費 10キロ/リットル × ガソリン代 143円 × 2台分  計算結果 1601.6円 2.各車輌に支払う交通費の算出 ・計算式  走行距離 56キロ ÷ A車の燃費 15キロ/リットル × ガソリン代 143円 = 533.8666...円.  走行距離 56キロ ÷ B車の燃費 5キロ/リットル × ガソリン代 143円 = 1,601.6円  合計金額 2135.4666....円 1の計算結果と、2の計算結果で533円も誤差が生じてしまいます どちらの計算も、交通費の算出の為のものですが 燃費の平均を出してから行う計算と、 個別に費用を計算して行う方法で誤差が発生する理由が全くわかりません この理屈は一体同友事でしょうか、ご教授ください

専門家に質問してみよう