JavaScriptの演算誤差について


■演算誤差とは

 0.1を10回足したら、いくつになるでしょうか? 答えは1です。しかし、この計算をコンピューターで計算を行うと1にならずに0.999999になってしまいます。つまり計算による誤差が発生してしまうのです。コンピューターで行われる小数値の計算は演算誤差が発生します。これは内部では10進数でなく2進数に変換されて計算されるためです。内部が10進数、BCD演算が行われている場合には、このような演算誤差は非常に少なくなります。詳しくは演算誤差というキーワードで検索して調べてみてください。


■ブラウザでの結果

 ここでは各ブラウザでの演算誤差の結果を示します。0.1を10回計算した結果と0.1と0.4-0.3の計算結果を比較したもので行っています。ブラウザ名の部分をクリックすると実際の実行画面をキャプチャーした画像が表示されます。

OS ブラウザ 0.1を10回計算した結果 0.1と0.4-0.3の比較結果
Windows 98 Internet Explorer 4.0 × ×
Windows 2000 Internet Explorer 5.0 × ×
Windows Me Internet Explorer 5.5 × ×
Windows XP Home Internet Explorer 6.0 × ×
Windows XP Home Netscape 6.2 × ×
Windows XP Home Netscape 7.1 × ×
Windows XP Home Firefox 1.0beta × ×
Windows XP Home Opera 6.06 × ×
Windows XP Home Opera 7.23 × ×
Windows XP Professional (SP2) Internet Explorer 6.0 × ×
Macintosh (MacOS X 10.3) Internet Explorer 5.2.3 × ×
Macintosh (MacOS X 10.3) Netscape 7.1 × ×
Macintosh (MacOS X 10.3) Mozilla 1.7.2 × ×
Macintosh (MacOS X 10.3) Firefox 0.8 × ×
Macintosh (MacOS X 10.3) Opera 6.03 × ×
Macintosh (MacOS X 10.3) Opera 7.5 × ×
Macintosh (MacOS X 10.3) iCab 2.9.8 ×


 スクリプトは以下のようになっています。こちらのページで実行できます。
	<html>
	<head>
	<title>演算誤差テスト</title>
	</head>
	<body>
	<h1>演算誤差テスト</h1>
	<br>
	■0.1を10回加算<br>
	<script language="JavaScript"><!--
	for (i=0,n=0; i<10; n+=0.1,i++);
	document.write(n);
	// --></script>
	<br>
	<hr>
	<br>
	■0.1と0.4-0.3の結果の比較<br>
	<script language="JavaScript"><!--
	a = 0.1;
	b = 0.4-0.3;
	if (a == b) document.write("0.1と0.4-0.3は同じ");
	if (a < b) document.write("0.1は0.4-0.3より小さい");
	if (a > b) document.write("0.1は0.4-0.3より大きい");
	// --></script>
	<br>
	<hr>
	<br>
	</body>
	</html>