ホームページ >ウェブフロントエンド >jsチュートリアル >JS_javascript の乗算における浮動小数点エラーを解決する方法のヒント

JS_javascript の乗算における浮動小数点エラーを解決する方法のヒント

WBOY
WBOYオリジナル
2016-05-16 17:05:291357ブラウズ

JS で 10 進数の乗算を実行すると浮動小数点エラーが発生します。具体的にテストできます。

<スクリプト>
アラート(11*22.9)

結果は 251.9 ではなく 251.89999999999998 になります

この問題は多くの人にとって頭の痛い問題でしょう。では、どうすれば解決できるでしょうか?ここに解決策があります。

1.


コードをコピーします コードは次のとおりです。
<script> <br>alert(11*(22.9*10)/10); <br></script>

この問題を解決するための一般的なアイデアは、まず係数を整数に増幅することです。最後に、それを対応する倍数で除算すると、正しい結果が得られます。
2.

コードをコピーします コードは次のとおりです:

この解決策はさらに面倒ですが、この問題を解決する実際のプロセスの概要を知ることができます。

整数の四捨五入を行うには、js で Math.round を使用することもできます。小数点以下の精度を実現する必要がある場合は、関数を記述する必要があります。


コードをコピーします コードは次のとおりです。function ForDight(Dight,How) {
Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How);
return
}

//正確な除算結果を取得するために使用される除算関数
//説明: JavaScript の除算結果にはエラーが発生します。これは、2 つの浮動小数点数を除算する場合にさらに顕著になります。この関数は、より正確な除算結果を返します。 //呼び出し: accDiv(arg1,arg2)

//戻り値: arg1 を arg2 で除算した正確な結果
function accDiv(arg1,arg2){
var t1=0,t2= 0 ,r1,r2;
try{t1=arg1.toString().split(".")[1].length}catch(e){}
try{t2=arg2.toString(). split (".")[1].length}catch(e){}
with(Math){
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
}
}

//呼び出しをより便利にするために、Div メソッドを Number 型に追加します。
Number.prototype.div = function (arg){

return accDiv(this, arg);

}

//正確な乗算結果を取得するために使用される乗算関数
//説明: JavaScript の乗算結果にはエラーが発生します。これは、2 つの浮動小数点数を乗算するとより顕著になります。この関数は、より正確な乗算結果を返します。

//呼び出し: accMul(arg1,arg2)

//戻り値: arg1 と arg2 を乗算した正確な結果
function accMul(arg1,arg2)
{
var m=0 , s1=arg1.toString(),s2=arg2.toString();
try{m =s1.split(".")[1].length}catch(e){}
try{m = s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".", " "))/Math.pow(10,m)
}

// 呼び出しをより便利にするために、Number 型に mul メソッドを追加します。
Number.prototype.mul = function (arg){

return accMul(arg, this);

}

//正確な加算結果を取得するために使用される加算関数
//説明: JavaScript の加算結果にはエラーが含まれます。これは、2 つの浮動小数点数を加算するときにより顕著になります。この関数は、より正確な加算結果を返します。

//呼び出し: accAdd(arg1,arg2)

//戻り値: arg1 と arg2 の正確な結果
function accAdd(arg1,arg2){
var r1,r2,m;
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
try{r2=arg2.toString().split(". ")[1].length}catch(e){r2=0}
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m arg2*m)/ m
}

//呼び出しをより便利にするために、Number 型に add メソッドを追加します。
Number.prototype.add = function (arg){

return accAdd(arg,this);

}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。