JS浮動小数点数表示法
もっと読む
【前言】
本論文は簡単にJS浮動小数点表現法(不正確)の解決方法を説明する.
【主体】
JavascriptはIEEE-755浮動小数点数表現法を採用しています.これはバイナリ表現法で、スコアを正確に表します.例えば、1/2、1/8、1/1024.残念なことに、私たちがよく使う得点は10進数の1/10、1/100などです.バイナリ浮動小数点の表現は0.1のような簡単な数字を正確に表現できません.ですから、js浮動小数点演算は正確ではありません.
たとえば:
私たちは普通jsの四則演算を書き換えます.
...
【前言】
本論文は簡単にJS浮動小数点表現法(不正確)の解決方法を説明する.
【主体】
JavascriptはIEEE-755浮動小数点数表現法を採用しています.これはバイナリ表現法で、スコアを正確に表します.例えば、1/2、1/8、1/1024.残念なことに、私たちがよく使う得点は10進数の1/10、1/100などです.バイナリ浮動小数点の表現は0.1のような簡単な数字を正確に表現できません.ですから、js浮動小数点演算は正確ではありません.
たとえば:
js :9.3+0.3;// 9.600000000000001
js :9.3-0.7;// 8.600000000000001
js :7*0.8;// 5.6000000000000005
js :9.3/0.3;// 31.000000000000004
解決方法:浮動小数点をまず整数に変換してから計算し、計算してから結果を小数に変換します.私たちは普通jsの四則演算を書き換えます.
//JS
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
}
//JS
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));
//
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
}
//JS
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)
}
//JS
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);
}
}
...