下記のようなページで
<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なのですが。。。。
どなたか、原因、対処法をご存知の方、ご教授ください。
よろしくお願い致します。

A 回答 (5件)

> ちなみに、掛け算だけこのような問題がでるのでしょうか?


> 割り算などでは問題は起きないのでしょうか?

これは、実数が浮動小数点で表現されていることに起因する問題ですから、演算の
種類に限らず発生する問題です。

手元の 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. …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

printf関数を利用すればよいのですね。
printfは書式付の書き出しという意味ですか?
ただ、printf()関数をどういった形で利用すればよいのでしょうか?

すみません。プログラムの基本をわかってないものですから。

お礼日時:2002/03/19 23:11

こんにちは、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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>document.f.t3.value = ((parseFloat(document.f.t1.value) * 100.0) * parseFloat(document.f.t2.value)) / 100.0 ;
parseFloatを使って、100をかけ、あとで100で割るという作業をするのですね。

お礼日時:2002/03/20 01:21

割り算でも誤差が生じる場合があるみたいです。


整数の足し算でも誤差が生じる場合があります。
桁数が多いとなるみたいです。
    • good
    • 0
この回答へのお礼

お返事有難うございます。
下記のa-kumaさんのようになるのですね。
実際に試してみましたら、
1.01-1.1=09000000000000008
となりました。
(私はWINのIE6です)

お礼日時:2002/03/19 22:42

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 にする。

こんな感じでも出来そうです。
    • good
    • 0
この回答へのお礼

貴重なご意見有難うございます。

なるほど、999の場合と001のパターンで場合わけするのですね。

ちなみに、掛け算だけこのような問題がでるのでしょうか?
割り算などでは問題は起きないのでしょうか?

お礼日時:2002/03/17 23:17

こんばんわぁ、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桁まで求めるようにしています。


ではでは(@^^)/~~~
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
たぶん、誤差の問題だろうとは思っていましたが。。
これは、ひどいですよね。Javascriptは。

2桁ですか。。
もっとほしいときもあるのですが、危険ですよね。

その都度考えるようにします。

お礼日時:2002/03/17 23:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q乗算した時に数値が変わってしまいます

計算のプログラムを組んでいます。
そこの途中で以下のような計算があります。

var x01 = ( 1 + x0 + eval(c.form7.value) / 100)
var x02 = x01 * 100

x0=1.06
form7=24
つまりx01=2.3です。
これは実際に表示して確認しました。
しかし、x02=299.9999...になっています。
単純に*100しただけなのですが何故なのでしょうか。
分かる方がいらっしゃいましたら是非ご教授下さい。

Aベストアンサー

[対処例]
  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乗; となります。

ご参考までに。

[対処例]
  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
のように、小数部の深いところで「過不足」が生じる場合が...続きを読む

Qテーブルタグの中にdivを含めてはダメ?

テーブルタグの中にdiv要素を入れるとダメなのでしょうか?
何か不都合でもあるのでしょうか?
何かご存知の方がいれば教えていただけませんか?

Aベストアンサー

以下、HTML 4.01での話です。(XHTMLでもほぼ同じだと思います)

tableタグ直下に書けるのは、caption,col,colgroup,head,tfoot,tbodyと定義されています。
特定の条件下でtbodyが省略できますので、実際はtrも書けます。これら以外は書けないことになっています。
tr直下にはth,tdが書けることになっています(それ以外は不可)。

th,tdの下にはブロック要素が書けるので、divも書けます。

このように、テーブル内でth,tdの中以外でdivが使えないのはHTMLの仕様でそう決まっているからです。

Q日付入力欄の表示形式を自動的に「yyyy/mm/dd」形式にしたい。

FORMによる入力ページを作成しているのですが、日付入力の欄に「yyyymmdd」の形式で入力したものをフォーカスが移動した時点で、自動的に「yyyy/mm/dd」の表示形式に変更して表示し、なおかつフォームデータを送信したした時のデータは「yyyymmdd」の形式で送信したいと思っています。(※データベース上はyyyymmddの為)
同様のスクリプトを探してみたのですが、なかなか見つからず困っています。
Javascriptではなく、他の方法でも可能な方法があればそちらでもかまいません。
よろしくお願いいたします。

Aベストアンサー

onFucusとonBlurで整形するといいのでは?
もちろん応用で送信するときにyyyymmddにすることは
可能ですが、そもそも「データベース上はyyyymmddの為」
ということはなんのインジェクションもなしにデータ
ベースに挿入しようとしていますので、これは問題外。
破壊的なデータを送られてきたらどうするつもりでしょう?

送る側でやってもいいですが、送られてきた側がサーバー上
のプログラムでデータの整合性をみてスラッシュを
はずす方が効率的だと思います。

ただ普通はデータベースならDATE型で管理する物なので
この手の作業は発生しませんが・・・。

<script type="text/javascript">
function dateFormat(obj,flg){
var str0=obj.value
if(flg){
if(str0==""){
return
}else if(str0.match(/[0-9]{8}/)){
str1=str0.substring(0,4)+"/"+str0.substring(4,6)+"/"+str0.substring(6,8)
obj.value=str1
}else{
alert("8桁の数字を入力してください")
obj.value="";
}
}else{
str1=str0.split("/").join("");
obj.value=str1
}
}
</script>
<form>
<input type="text" size="15" onBlur="dateFormat(this,true)" onFocus="dateFormat(this,false)">
</form>

onFucusとonBlurで整形するといいのでは?
もちろん応用で送信するときにyyyymmddにすることは
可能ですが、そもそも「データベース上はyyyymmddの為」
ということはなんのインジェクションもなしにデータ
ベースに挿入しようとしていますので、これは問題外。
破壊的なデータを送られてきたらどうするつもりでしょう?

送る側でやってもいいですが、送られてきた側がサーバー上
のプログラムでデータの整合性をみてスラッシュを
はずす方が効率的だと思います。

ただ普通はデータベースならDATE型で...続きを読む

Qonchangeイベントを強制的に発生させる

お世話になります。
onchangeイベントをjavascriptで強制的に動作させたいと思っております。

発生させたい場合
・ユーザーがtextボックスを入力
・リンクボタンを押下した場合

簡単なことなのかもしれませんが、
ご教授よろしくお願いいたします。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<script type="text/javascript">

function change(){
alert('test');
}

function update(){
document.getElementById('1').value = "update";
document.getElementById('1').onchange = change;
}


</script>

<input id="1" type="text" value="1" onchange="change();">

<a href="javascript:update();">update</a>

お世話になります。
onchangeイベントをjavascriptで強制的に動作させたいと思っております。

発生させたい場合
・ユーザーがtextボックスを入力
・リンクボタンを押下した場合

簡単なことなのかもしれませんが、
ご教授よろしくお願いいたします。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<script type="text/javascript">

function change(){
alert('test');
}

function update(){
document.getElementById('1').value = "update";
document.getElementById('1').onchan...続きを読む

Aベストアンサー

回答は出てますが・・・onchangeにこだわるなら、

document.getElementById('***').onchange();

()を付ければ呼び出せます。(Windows FireFox2、Opera8で確認)


var f = document.getElementById('***').onchange;
f();

IE6の場合はいったん変数に代入する必要があるようです。

Qテキストボックスに数字しか入力できないようにするには?

タイトルの通りなのですが、あるテキストボックスに数字しか入力できないようにしたいのですが可能でしょうか?また、

「あいうえお 12345 「」:・、¥・」

というような文字列をコピーし、そのテキストボックスにペーストした際にも数字の12345だけが残るといった事も実現したいのですが…

どなたかご存知の方いらっしゃいましたら教えて頂けると幸いです。

Aベストアンサー

>英数字

では、こんな感じで

<input type="text" onKeyup="this.value=this.value.replace(/[^0-9a-z]+/i,'')">

Qhtmlでテーブル内にテキストボックスを作りたいのですが・・・

教えてください。

2行のテーブルを作ろうとしています。
1行目が項目で
2行目が入力できるようにしたいです。

入力できるようにしたいので
テーブル内にテキストボックスを作ったのですが
どうしてもテーブルを作る囲い線と
テキストボックスの右側の間に余白ができてしまいます。

テキストボックスの下にできる余白は
<form>
<table>
</table>
</form>
という感じで、テーブルをフォームで囲むことで
無くすことができました。

HTMLでこの余白を消せる方法がありましたら
ぜひ、教えてください。
よろしくお願いしますm(__)m

Aベストアンサー

ANo.1です。
「1行目が項目で2行目が入力」という事は、tableの構成は正しくはこうでしたね。

(省略)
<tr>
<th>項目名</th>
</tr>
<tr>
<td><input type="text" size="50" maxlength="100" name="hoge01" value=""></td>
</tr>
(省略)

失礼しました。でも、この結果でも同じですよ。

ただし…仮に、「項目名」に相当するデータのボリュームが、2行目の入力フィールドの長さより相対的に長くなってしまえば、当然余白はできますが。
そういう問題ではないですよね?

Qテーブルの行の高さを指定する時全てのtdタグに?

スタイルシートでテーブルの行の高さを指定する時は、
全てのtdタグにスタイルシートを指定するべきか、
1つだけ(一番左だけ)指定すればいいのかわからないので押してください。


全てのtdタグに指定しても、一つのtdタグに指定しても、結局はその行の高さは指定した高さになります。

コードを書く上でどちらが適切か教えてください。
--------------------------------------------------


<style type="text/css">

td.test {height: 50px;}

</style>

<body>

1の例<br>(2列ともclass="test"を入れた)<br>

<table border=1>
<tr><td class="test">1</td><td class="test">2</td></tr>
<tr><td class="test">3</td><td class="test">4</td></tr>
</table>

<br><br>

2の例<br>(一番左の列だけclass="test"をいれた)<br>

<table border=1>
<tr><td class="test">1</td><td>2</td></tr>
<tr><td class="test">3</td><td>4</td></tr>
</table>

<br><br>

3の例<br>(スタイルシートは何も指定していない)<br>

<table border=1>
<tr><td>1</td><td>2</td></tr>
<tr><td>3</td><td>4</td></tr>
</table>

スタイルシートでテーブルの行の高さを指定する時は、
全てのtdタグにスタイルシートを指定するべきか、
1つだけ(一番左だけ)指定すればいいのかわからないので押してください。


全てのtdタグに指定しても、一つのtdタグに指定しても、結局はその行の高さは指定した高さになります。

コードを書く上でどちらが適切か教えてください。
--------------------------------------------------


<style type="text/css">

td.test {height: 50px;}

</style>

<body>

1の例<br>(2列ともclass="test"を入れた...続きを読む

Aベストアンサー

テーブルの行の高さ、なので <tr> タグに指定するのが素直でしょうか。

<style>
table tr { height:1em; } /* 全ての行に適用 */
table tr.test { height:3em; } /* 特定の行のみ適用 */
</style>

<table border>
<tbody>
<tr> <td> 1 <td> 2
<tr> <td> 3 <td> 4
<tr class=test> <td> 5 <td> 6
</table>


人気Q&Aランキング