下記のようなページで
<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.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桁ですか。。
もっとほしいときもあるのですが、危険ですよね。
その都度考えるようにします。
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.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で割るという作業をするのですね。
お探しの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ランキング
-
C言語クイックソートの比較総回...
-
javascriptでhiddenに二次元配...
-
VB.NET DateTimeの型について
-
hiddenのvalueの値を変えたい
-
テキストエリア内容からチェッ...
-
JavaScriptでBMI計算
-
value内に変数を入れたい
-
Pythonで会員サイトの自動ログ...
-
switchを使って四則演算のプロ...
-
セレクトボックスの初期選択状...
-
クイズ作成:15個の問題から5個...
-
ラジオボタンとテキストを同時...
-
選択したラジオボタンに対応し...
-
return trueとreturn falseの用...
-
追加ボタンを押した際に ok ボ...
-
チェックボックスのON/OFFでVal...
-
<form action="#">の意味とは?
-
jQuery セレクトボックスで選択...
-
フォームが空欄の時にフォーム...
-
【jQuery】input nameの文字列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
hiddenのvalueの値を変えたい
-
value内に変数を入れたい
-
複数のsubmitボタンで押された...
-
3桁区切りのカンマをつけたい...
-
VB.NET DateTimeの型について
-
javascriptでhiddenに二次元配...
-
テキストボックスに入力された...
-
eval()を使わずに数値を取得し...
-
引数に数値、文字列の混在
-
クイズ作成:15個の問題から5個...
-
sessionStorageを調べています。
-
setIntervalの間隔を途中で変更...
-
javascriptにてHTMLのhiddenエ...
-
name属性が同じフォームが複数...
-
セレクトボックスの初期選択状...
-
Pythonで会員サイトの自動ログ...
-
演算対象の数字と演算子を入力...
-
商品コードを入れたら自動で商...
-
フォームで入力した値を別のフ...
-
ラジオボタンの選択で解答・点...
おすすめ情報