WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptで小数点以下の計算をすると

るる [WriteDate : Fri May 18 17:34:55 2001]

 こんにちは。
 小数点以下のある数値の計算をした場合に、小数点以下に14桁程度のゴミが入る場合があるのですが、どなたか原因もしくは回避方法をご存知ないでしょうか?

 うまくいく例)  5.5*12.5=68.8
 うまくいかない例)5.5*10.5=57.800000000000004
                  ~~~~~~~~~~~~~~
 *下線部分がゴミ(小数点以下第2位以下は四捨五入しています。)


ひよこ [MAIL] [URL] [WriteDate : Fri May 18 21:02:29 2001]

これはPC内部での計算が2進法による事での現象です。
浮動小数点の数値を2進法に変換した場合きっちり当てはまらない場合にこうなります。

誤差を丸めるには計算する数値の内容により何桁目かで四捨五入するしかないと思います。


yuu [MAIL] [URL] [WriteDate : Sun May 20 04:14:00 2001]

>うまくいかない例)5.5*10.5=57.800000000000004

55*105/100にすれば良いのではないでしょうか。


ma-to [WriteDate : Sun May 20 10:41:23 2001]


以下はnn2とm17とe5.5で確認しています。数値を好みで変えて確認出来ます。

確認すれば次第に分かるように、誤差は当然ながらブラウザだけの問題ではないので、もっと本質的な解決策を取らないと不可能です。


<!-- doctype -->
<html lang="en"><head><meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<!--
...
-->
<script type="text/javascript"><!--
if(document.createStyleSheet){var s=document.createStyleSheet();
window.s&&s.addRule&&s.addRule('input','ime-mode:disabled;');}
//--</script></head><body><form action="#"><div><input type="text" name="t0"
accesskey="1" tabindex="1" value="3.141592"><samp>&#215;</samp><input
type="text" name="t1" accesskey="2" tabindex="2" value="2.71828"><input
type="hidden" name="h0" value="3.141592"><input type="hidden" name="h1"
value="2.71828"></div></form><script type="text/javascript"><!--
var e=document.forms[0].elements,sign,sign0,sign1,
e0,e1,e0_,e1_,_e0,_e1,_e0f,_e1f;e.l=e.length/2;function a(){
for(var i=0;i<e.l;i++){var ei=e[i].value;if(ei=='')return false;
while(ei.charAt(ei.length-1)==' ')ei=ei==' '?'':ei.substring(0,ei.length-1);
if(ei=='')return false;if(-1<ei.indexOf('.'))while(ei.charAt(ei.length-1)=='0')
ei=ei=='0'?ei:ei.substring(0,ei.length-1);while(ei.charAt(0)==' ')
ei=ei.substring(1,ei.length);if(ei=='')return false;
while(-1<ei.indexOf(' '))ei=ei.substring(0,ei.indexOf(' '))+
ei.substring(ei.indexOf(' ')+1,ei.length);eval('sign'+i+'=0;');
if(ei.charAt(0)=='+'||ei.charAt(0)=='-'){ei.charAt(0)=='-'&&
eval('sign'+i+'=1;');ei=ei=='+'||ei=='-'?'':ei.substring(1,ei.length);}
if(ei=='')return false;if(1<ei.length){if(ei.substring(0,2)=='0.')ei=='0.'&&
(ei='0');else while(1<ei.length&&ei.charAt(0)=='0'){ei=ei=='0.'?'0':
ei.substring(1,ei.length);if(2<ei.length&&ei.substring(0,2)=='0.')break;}}
ei.charAt(ei.length-1)=='.'&&(ei=ei=='.'?'0':ei.substring(0,ei.length-1));
ei.charAt(0)=='.'&&(ei=ei=='.'?'0':'0'+ei);var flag=0,dot=0;
for(var j=0;j<ei.length;j++){var eij=ei.charAt(j);eij=='.'&&dot++;
if(1<dot)return false;for(var k=0;k<10;k++)eij==''+k&&flag++;}
if(ei.length!=flag+dot)return false;e[eval(e.l)+i].value=ei;}
sign=sign0==sign1?1:-1;return true;}
function b(){a()&&alert(sign*eval(e[2].value+'*'+e[3].value));}
function cd(){e0=e[2].value;e1=e[3].value;e0.indexOf('.')<0&&(e0+='.0');
e1.indexOf('.')<0&&(e1+='.0');e0_=e0.substring(0,e0.indexOf('.'));
_e0=e0.substring(e0.indexOf('.')+1,e0.length);e1_=
e1.substring(0,e1.indexOf('.'));_e1=e1.substring(e1.indexOf('.')+1,e1.length);
_e0f=Math.pow(10,_e0.length);_e1f=Math.pow(10,_e1.length);}
function c(){if(!a())return;cd();alert(eval('(('+e0+'*'+_e0f+')*('+e1+
'*'+_e1f+'))/'+(_e0f*_e1f)));}
function d(){if(!a())return;cd();if(10<_e0f)while(_e0.charAt(0)=='0')
_e0=_e0.substring(1,_e0.length);if(10<_e1f)while(_e1.charAt(0)=='0')
_e1=_e1.substring(1,_e1.length);alert(eval(e0_+'*'+e1_+'+('+e0_+'*'+_e1+')/'+
_e1f+'+('+_e0+'*'+e1_+')/'+_e0f+'+('+_e0+'*'+_e1+')/'+(_e0f*_e1f)));}
//--></script><ul><li><a href="#" onclick="b();return false;"
onkeypress="b();return false;">direct</a></li><li><a href="#"
onclick="c();return false;" onkeypress="c();return false;">Sun May 20 04:14:00
2001</a></li><li><a href="#" onclick="d();return false;"
onkeypress="d();return false;">expand</a></li></ul></body></html>


るる [WriteDate : Mon May 21 10:21:42 2001]

ひよこさん、yuuさん、ma-toさん、レスありがとうございます!!
早速試してみますね〜!


るる [WriteDate : Mon May 21 17:38:18 2001]

こんにちは。

yuuさんの考え方で、計算式をいじってみるとうまくいきました。

ありがとうございました。


ma-to [WriteDate : Mon May 21 20:31:11 2001]


>るる [WriteDate : Mon May 21 17:38:18 2001]

>yuuさんの考え方で、計算式をい
>じってみるとうまくいきました。



。。。少し脱力感。それはたまたま多くの家電PCの特にメジャーなブラウザ環境では上手くいくだけですよ、と申したつもりでした。アホラシイのでどうでもいいですが。。。




ちゃいぱ [WriteDate : Mon May 21 21:26:34 2001]

ma-toさんへ
少なくとも、私は、ためしましたよ!
>//--</script></

//--></script></
も気付きました。

また、よろしくお願い致します。





るる [WriteDate : Tue May 22 09:29:25 2001]

ma-toさん

>。。。少し脱力感。
>それはたまたま多くの家電PCの特にメジャーなブラウザ環境では上手くいくだけですよ、と申したつもりでした。
>アホラシイのでどうでもいいですが。。。

 脱力させてしまってごめんなさい。
 ma-toさんのサンプルを試すのは試したんです。が、計算式をいじる方がカンタンだったので・・・。言葉足らずですみませんでした。
 レスとアドバイスをありがとうございました。


るる [WriteDate : Tue May 22 09:30:31 2001]

完了にし忘れました。すみません。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]
ChaichanPAPA's World