下記のようなページで
<HTML>
<HEAD>
<script language="JavaScript">
<!--
function calc() {
document.f.t3.value = eval(document.f.t1.value) * eval(document.f.t2.value);
return true;
}
//-->
</script>
</HEAD>
<BODY bgcolor="#FFFFFF">
<form name="f">
<input type="text" name="t1">
×
<input type="text" name="t2" onkeyup="calc()">
=
<input type="text" name="t3">
</form>
</BODY>
</HTML>
一番目のテキストフォームと2番目のテキストフォームに任意の数値を入力したら3番目のテキストフォームに掛け算された結果が表示されるというプログラムで、一番目に10.07と入力し、2番目に11を入力して掛け算をさせると110.77000000000001となってしまいます。
本当の結果は110.77なのですが。。。。
どなたか、原因、対処法をご存知の方、ご教授ください。
よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
> ちなみに、掛け算だけこのような問題がでるのでしょうか?
> 割り算などでは問題は起きないのでしょうか?
これは、実数が浮動小数点で表現されていることに起因する問題ですから、演算の
種類に限らず発生する問題です。
手元の NN4.7x で確認したのですが、例えば、以下のような計算が期待通りにいきません。
1.01 + 1.1
1.01 - 1.1
12.3 / 0.3
> これは、ひどいですよね。Javascriptは。
先ほども書いた通り、浮動小数点を扱うものは全てこの問題を抱えています。
JavaScript がひどいとしたら、実数をフォーマットして出力してくれる仕組み
(C だったら printf() 関数とか)を標準で用意していないことです。
まあ、みんなが欲しくなるものは、誰かが作っていたりします。例えば、参考URLの
ページなんかが。
参考URL:http://aoki2.si.gunma-u.ac.jp/JavaScript/src/io. …
ご回答ありがとうございます。
printf関数を利用すればよいのですね。
printfは書式付の書き出しという意味ですか?
ただ、printf()関数をどういった形で利用すればよいのでしょうか?
すみません。プログラムの基本をわかってないものですから。
No.5
- 回答日時:
こんにちは、xruzです。
誤差が生ずるのは2進数で演算しているためです。
回避方法(小数点以下が2桁の場合):
<HTML>
<HEAD>
<script language="JavaScript">
<!--
function calc() {
document.f.t3.value = ((parseFloat(document.f.t1.value) * 100.0) * parseFloat(document.f.t2.value)) / 100.0 ;
return true;
}
//-->
</script>
</HEAD>
<BODY bgcolor="#FFFFFF">
<form name="f">
<input type="text" name="t1">
×
<input type="text" name="t2" onkeyup="calc()">
=
<input type="text" name="t3">
</form>
</BODY>
</HTML>
がんばってくださいね(^:^i
ご回答ありがとうございます。
>document.f.t3.value = ((parseFloat(document.f.t1.value) * 100.0) * parseFloat(document.f.t2.value)) / 100.0 ;
parseFloatを使って、100をかけ、あとで100で割るという作業をするのですね。
No.4
- 回答日時:
割り算でも誤差が生じる場合があるみたいです。
整数の足し算でも誤差が生じる場合があります。
桁数が多いとなるみたいです。
お返事有難うございます。
下記のa-kumaさんのようになるのですね。
実際に試してみましたら、
1.01-1.1=09000000000000008
となりました。
(私はWINのIE6です)
No.2
- 回答日時:
alert(10.07*11)
が
110.77000000000001
になりました。
小数の場合、数字の最後の部分が 0001 と 9999 の
ような誤差が発生する場合がある。
小数の掛け算なら計算結果の小数の桁が予想できるから、
10.07*11 なら、小数は第2位までだと分かっているから
計算結果の数字から、コンマがあれば、コンマの右の
2つの数字までをコンマ無しで抜き出して、11077
小数第3位が9であれば1を足す。
最後にコンマを戻して 11077 にする。
10.07*0.145 なら、小数は第5位までだと分かっているから
計算結果の数字から、コンマがあれば、コンマの右の
5つの数字までをコンマ無しで抜き出して、146014
小数第6位が9であれば1を足す。
最後にコンマを戻して 1.46015 にする。
こんな感じでも出来そうです。
貴重なご意見有難うございます。
なるほど、999の場合と001のパターンで場合わけするのですね。
ちなみに、掛け算だけこのような問題がでるのでしょうか?
割り算などでは問題は起きないのでしょうか?
No.1
- 回答日時:
こんばんわぁ、Blackwinglsです。
これは恐らく丸め処理のせいでしょう。
ブラウザではこの丸め処理の誤差部分まで表示してしまうようなので、11.1+111.1 が正しい計算結果が得られない、という話をどこかで聞いた覚えがあります。
結局、作成者側で何桁まで必要か考えて四捨五入するしかないようです。
<script language="JavaScript">
<!--
function calc() {
var a = eval(document.f.t1.value) * eval(document.f.t2.value)
var b = Math.round(a * 100) / 100
document.f.t3.value = b
return true;
}
//-->
</script>
というのではどうでしょうか?
2桁まで求めるようにしています。
ではでは(@^^)/~~~
ご回答ありがとうございます。
たぶん、誤差の問題だろうとは思っていましたが。。
これは、ひどいですよね。Javascriptは。
2桁ですか。。
もっとほしいときもあるのですが、危険ですよね。
その都度考えるようにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- PHP php ログイン 1 2022/11/01 00:24
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
value内に変数を入れたい
-
%の計算の仕方
-
name属性の取得
-
checkboxとselectメニューの連...
-
ボタンの文字サイズ+入力バー...
-
自動的に連番生成したURLにリン...
-
Pythonで会員サイトの自動ログ...
-
送信フォームで送信ボタンをお...
-
VBSでブラウザ上のテキストボッ...
-
Javascript 郵便番号の入力欄で...
-
Javascriptの"return "について
-
ハイパーリンクを別ウインドウ...
-
フォームから入力すると、入力...
-
name属性のないformタグの、中...
-
プルダウン 項目が多いので先頭...
-
ラジオボタンのNullチェック
-
JavaScriptで特定のtdタグにcla...
-
入力フォームに半角スペース以...
-
マウスカーソルの変更
-
ツリービューのチェックボック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
value内に変数を入れたい
-
hiddenのvalueの値を変えたい
-
3桁区切りのカンマをつけたい...
-
VB.NET DateTimeの型について
-
複数のsubmitボタンで押された...
-
テキストボックスに入力された...
-
フォーム内容を上から順番にJav...
-
VBAをJavaScriptに変換したいです
-
大量のselect要素のvalueを短い...
-
javascriptでhiddenに二次元配...
-
フォームで入力した値を別のフ...
-
プルダウン選択時、既に入力済...
-
ラジオボタンと連動して文字列...
-
クイズ作成:15個の問題から5個...
-
引数に数値、文字列の混在
-
クリックの度に加算していくには?
-
setIntervalの間隔を途中で変更...
-
Pythonで会員サイトの自動ログ...
-
JavaScriptによる自動計算フォ...
-
selectboxのoptionタグのvalue...
おすすめ情報