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);
  }
}
 
 
...