js加減乗除は精度問題と方法を考慮する必要があります.

4394 ワード

javascript:document.write(11.3-0.1).tofixed(2)toFixed()方法は余分な小さい数位を切り取るだけではなく、切り取り位置の次の小さい数位によって四捨五入します.例えば、数値10.739に対して、小数点以下の二桁を切り取った結果、10.74となります.数値の10.732については、小数点以下の二桁を切り取り、結果は10.73です.注意してください.JavaScriptでは小数点以下の0位から20位までの小数点しか取れません.tofixed()メソッドは高バージョンのブラウザのみによってサポートされていますので、使う前にブラウザがこの方法をサポートしているかどうかを確認して、チェックするコードは以下の通りです.var varNumber=22.234;if(varNumber.toFixed){varNumber=varNumber.tofixed(2);}else/ブラウザはtoFixedをサポートしていません.他の方法を使って{var div=Math.pow(10,2);varNumber=Math.round(varNber ber*div/div)はどうやって解決できますか?なぜこのように理解できない答えが出てきましたか?Googleを使いましたが、これはJavaScriptの浮動小数点演算の一つのバグです.例えば、7*0.8 JavaScriptで計算したら、5.600000000000 5ネットで解決方法を見つけました.つまり、浮動小数点演算の関数を書き直しました.これらの方法を抜粋して、同じ問題に遭遇した友達の参考にします.プログラムコード/除法関数は、正確な除算結果を得るために用いられます.この関数はより正確な除算結果を返します./呼び出し:accDiv(arg 1,arg 2)//戻り値:arg 1をarg 2で割った正確な結果Fnction accDiv(arg 1,arg 2){var t 1=0,t 2=0,r 1,r 2;try{t 1=arg 1.toString().split("."""""""""""""""""""""(2."""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""Math){r 1=Number(arg 1.toString().replace(“.”,“”))))]r 2=Number(arg.tostring().replace(“.”)return(r 1/r 2)*pow(10,t 2-t 1)/{Numberタイプにdivメソッドを追加して、より便利に呼び出すことができます.Number.prototype.div=function(arg){return accDiv(this,arg)}.//乗算関数は、正確な乗算結果を得るために使用されます./説明:javascriptの乗算結果に誤差があり、2つの浮動小数点を掛け合わせたときに明らかです.この関数は、より正確な乗算結果を返します.try{m+=s 1.split(「.」)[1].length]cattch(e){try{m+=s 2.split(「.」)[1].length]catttch(e){return Number(s 1.replace(「.」)*Number.(")/proplace/Maspattttmber/proplace)を追加します./proplace/attttttttttttttttttttttmmmmmmmmber/proplace/proplace/proplace/prospspspspspspspattttttttttt. mul=function(arg){return accMul(arg,this);//加算関数は、正確な加算結果を得るために使用されます.説明:javascriptの加算結果に誤差があります.2つの浮動小数点を加算するときに明らかです.この関数はより正確な加算結果を返します.[1].length t cattch(e){r 1=0}try{r 2=arg 2.toString().split(".")[1].length}cattttch(e){r 2=0}m=Math. pow(10,Math.max(r 1,r 2))returnrnrnrnrnrnrnrnrn.rernrnrnrn(arg1/dedededededededededededededededededededededededededettttttttttttttttdededededededededededededededededededededededededededededededededededededededededededeaccAdd(arg,this);使用するところにこれらの関数が含まれています.それを呼び出して計算すればいいです.たとえば、計算したい場合は7*0.8を(7).mul(8)に変更します.他の演算は類似しています.比較的正確な結果が得られます.----------------------------------------------以上はネット上のJS牛人のブログに転載されていますが、上では足し算、掛け算、除算の解決方法しか述べていません.この時、多くの人が、足し算があって、引き算は容易ではないと考えていますか?私は悪いです.この考え方を害されました.他のものは多く言わないです.減算のコードを書き込む:function Subtr(arg 1,arg 2){var 1,r 2,m,n;try{r 1=arg 1.toString().split(“.”)[1].length]catttttttttch(e.{r 1=2.starttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt10,Math.max(r 1,r 2)//last modify by deeka/ダイナミック制御精度長n=(r 1>=r 2)?r 1:r 2;return((arg 1*m-arg 2*m)/m).toFixed(n);
以上は転載内容によるものです.ありがとうございます.
加減乗除の方法を添付します.
// 
function Subtr(arg1,arg2){
	var r1,r2,m,n;
	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));
	//last modify by deeka
	//        
	n=(r1>=r2)?r1:r2;
	return ((arg1*m-arg2*m)/m).toFixed(n);
	}
// 
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
	}
// 
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)
}
// 
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);
	}
}