No.4ベストアンサー
- 回答日時:
[対処例]
x0 = 1.06;
x01 = 1 + x0 + eval(c.form7.value)/100;
x02 = Math.round(x01 * 10000)/100;
[備考]
x02 = x01 * 1000/10
では、例えば
「x0 = 1.04」「c.form7.value = 24」や
「x0 = 1.06」「c.form7.value = 22」
の場合、意図する結果が得られないはずです。試してみてください。
小数部のある値を含んだ計算をすると、例えば
x02 = 229.9999999999997
x02 = 230.0000000000005
のように、小数部の深いところで「過不足」が生じる場合があります。
対処策としては、得ようとする結果に影響が生じない、小数部の深い桁数の箇所を四捨五入しています。
JavaScriptの四捨五入(Math.round)は、小数部1桁目の四捨五入だけで、対象桁数の指定ができませんので、上記の対処例では、100倍にした値を四捨五入して整数にし、その結果を100で割って戻しています。
得ようとする計算結果が整数のみの場合は
x02 = Math.round(x01 * 100); でも有効です。
小数点以下 N桁まで必要な場合は、
x02 = Math.round(x01 * 100 * 10のN乗)/10のN乗; となります。
ご参考までに。
回答ありがとうございます。
とりあえずcriketさんの仰る通りに変更し、問題なく動作するようになった、と思います(汗)。
どのような条件化において「過不足」が発生するのか分からないので、出来るだけ多くのパターンで動作確認してみようと思います。
Math関数については知っていた(以前勉強した)ことだったのですが、Math.floorばかり使っていたので忘れていました。
現在作っているプログラムは切り捨ても混ざっているので大変そうですが頑張ってみます。
ありがとうございました。
No.3
- 回答日時:
いろいろ調べてみた結果、コンピュータの内部で計算するときに2進数に変換してから計算されることによる「誤差」だそうです。
「javascript 演算 誤差」でぐぐったら結構ヒットしましたのでお知らせしておきますね。対処方法もあるようです。
対処方法例
http://www.interq.or.jp/japan/satoshi0/sample/sy …
追伸:OS、ブラウザ毎の検証結果もありました。
http://www.openspc2.org/JavaScript/gosa/
参考URL:http://www.google.co.jp/search?num=50&hl=ja&rls= …
回答ありがとうございます。
自分でも検索したのですが、検索ワードが悪かったのか求める結果が得られませんでした。
わざわざ調べて頂いてありがとうございました。
凄く勉強になりました。
No.2
- 回答日時:
私の環境で試してみたところ、
x01=2.3
x02=229.9999999999997
でした。
99x02=299.9999...
にはならないと思います。
仮に、x02=229.9999999999997
との書き間違いであるのならばそれは正しいです。
浮動小数点数を使用しているための
桁落ちによる誤差です。
回答ありがとう御座います。
今確認してみた所
x01=2.3
x02=229.99999999999997
でした。
私の確認ミスでした、申し訳ありません。
arakororinさんの回答を参考に調べてみた所
var x01 = ( 1 + x0 + eval(c.form7.value) / 100);
var x02 = x01 * 1000 / 10;
とすることで
x01=2.3
x02=230
を得ることが出来ました。
しかしこれはブラウザの環境によって違ってくる可能性があるとのことなのですが、そこの所はどうなのでしょうか?
No.1
- 回答日時:
var x01 = ( 1 + x0 + eval(c.form7.value) / 100)
ここでx01の値はどうなってます?2.9999...出ないでしょうか?
var x01 = ( 1 + x0 + (eval(c.form7.value) / 100))
↑こう書いてみるとか、括弧の位置を変えて試してみたらどうでしょう?あとは、まとめて式を書かないで、2つに分けてx01を求める形にしてみるとか。
ここから独り言。evalって初めて見ました。なので調べてみました。文字列から数値への変換、文字列で示された計算式の計算に有効な関数のようですね。evalはずして見たらどうなんでしょ?
回答ありがとう御座います。
yamada_28さんの仰る通りやってみましたがどちらもダメでした。
x01は必ず2.3になるようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
O(n log n)について2
-
除算を使わずに10で割りたい。
-
16進数 加算 減算 C言語
-
c languageで 簡単な質問があ...
-
浮動小数演算は実行環境の変化...
-
有効数字について 以前質問をし...
-
VB6のFIX関数での誤差について
-
ExcelのINT関数の計算結果がお...
-
色の判定
-
ExcelでPC(パソコン)によって...
-
Excelで小数点以下の値が正常に...
-
EXCELの関数"STDEV(標準偏差)"...
-
データ型 double の桁数について
-
オーディオデータの22050hzから...
-
エクセル計算 答えは同じなの...
-
三菱シーケンサ(Aシリーズ)で...
-
対数減衰を実現するときの具体...
-
浮動小数点の切り捨てで-0.5を-...
-
2進数の足し算(C言語)
-
距離から緯度経度を求める方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
O(n log n)について2
-
VB.net Double と...
-
c languageで 簡単な質問があ...
-
ExcelのINT関数の計算結果がお...
-
有効数字について 以前質問をし...
-
ExcelでPC(パソコン)によって...
-
三菱シーケンサ(Aシリーズ)で...
-
除算を使わずに10で割りたい。
-
16進数 加算 減算 C言語
-
EXCELの関数"STDEV(標準偏差)"...
-
VB6.0での小数点の扱いについて
-
”/”を使わずに割り算したいんで...
-
距離から緯度経度を求める方法
-
VBAでミリ秒まで出力する方法
-
floatの有効桁数
-
コンピューターは指数関数をど...
-
時刻の比較
-
計算の丸め誤差の解消について
-
Double型について
-
powf を使わずにべき乗を計算
おすすめ情報