js算數運算精度問題解決方案

antzone發表於2017-03-24

在進行算數運算的時候,可能會出現精度問題,當然這個問題在各個語言中都有,但是多數語言都進行了封裝,也可以說那些語言不存在這個問題,但是javascript在這個方面就沒有如此體貼,所以需要程式設計師自行處理,下面就是能夠實現此功能的相應的程式碼。

一.算數加運算:

[JavaScript] 純文字檢視 複製程式碼
function numAdd(num1,num2){ 
  var baseNum,baseNum1,baseNum2; 
  try{baseNum1=num1.toString().split(".")[1].length;} 
  catch(e){baseNum1 = 0;} 
  try{baseNum2 = num2.toString().split(".")[1].length;} 
  catch(e){baseNum2 = 0;} 
  baseNum = Math.pow(10, Math.max(baseNum1, baseNum2)); 
  return (num1 * baseNum + num2 * baseNum) / baseNum; 
};

以上程式碼可以消除加運算的精度問題。

二.算數減運算:

[JavaScript] 純文字檢視 複製程式碼
function numSub(num1,num2){ 
  var baseNum,baseNum1,baseNum2; 
  var precision;
  try{baseNum1=num1.toString().split(".")[1].length;} 
  catch(e){baseNum1=0;} 
  try{baseNum2=num2.toString().split(".")[1].length;} 
  catch(e){baseNum2=0;} 
  baseNum=Math.pow(10, Math.max(baseNum1, baseNum2)); 
  precision=(baseNum1 >= baseNum2) ? baseNum1 : baseNum2; 
  return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision); 
};

以上程式碼可以消除減運算的精度問題。

三.算數乘運算:

[JavaScript] 純文字檢視 複製程式碼
function numMulti(num1,num2){ 
  var baseNum=0; 
  try{baseNum+= num1.toString().split(".")[1].length;} 
  catch(e){} 
  try{baseNum += num2.toString().split(".")[1].length;} 
  catch(e){} 
  return Number(num1.toString().replace(".",""))*Number(num2.toString().replace(".",""))/Math.pow(10,baseNum); 
};

以上程式碼可以消除乘法運算的精度問題。

四.算數除法運算:

[JavaScript] 純文字檢視 複製程式碼
function numDiv(num1,num2){ 
  var baseNum=0,baseNum2=0; 
  var baseNum3,baseNum4; 
  try{baseNum1=num1.toString().split(".")[1].length;} 
  catch(e){baseNum1=0;} 
  try{baseNum2=num2.toString().split(".")[1].length;} 
  catch(e){baseNum2=0;} 
  with(Math){ 
    baseNum3=Number(num1.toString().replace(".", "")); 
    baseNum4=Number(num2.toString().replace(".", "")); 
    return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1); 
  } 
};

以上程式碼可以消除除法運算的精度問題。

相關文章