国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解js加減乘除精確計算

2024-05-06 15:41:35
字體:
來源:轉載
供稿:網友

JS無法進行精確計算的bug

在做CRM,二代審核需求審核詳情頁面時。需要按比例(后端傳類似0.8的小數)把用戶輸入的數字顯示在不同的地方。
在做dubheInvest = invest * (1 - ratio);運算時發現問題。具體如下:
示例代碼:

console.log( 1 - 0.8 ); //輸出 0.19999999999999996 console.log( 6 * 0.7 ); //輸出 4.199999999999999 console.log( 0.1 + 0.2 ); //輸出 0.30000000000000004 console.log( 0.1 + 0.7 ); //輸出 0.7999999999999999 console.log( 1.2 / 0.2 ); //輸出 5.999999999999999 

通過上面舉出的例子可以看到,原生的js運算結果不一定準確,會丟失精度。

解決方案

解決方案的原理是,將浮點數乘以(擴大)10的n次方倍,把浮點數變為整數后再進行相應的運算,最后將得到的結果除以(縮小)10的n次方倍。

原理示例:

將console.log(1-0.8);  變為 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正確的值
根據上述原理,可以封裝一些方法出來解決此類問題。如下所示(Math.pow(x, y);表示求x的y次方):

//加 function floatAdd(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 floatSub(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); }   //乘 function floatMul(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 floatDiv(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){}      r1=Number(arg1.toString().replace(".",""));    r2=Number(arg2.toString().replace(".",""));   return (r1/r2)*Math.pow(10,t2-t1); } 

以上所述是小編給大家介紹的js加減乘除精確計算詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對錯新站長站網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 蒙山县| 玉田县| 崇礼县| 阿城市| 延安市| 盐津县| 营口市| 乌鲁木齐县| 镇江市| 城固县| 大竹县| 苍梧县| 鸡西市| 商河县| 兰西县| 西青区| 麟游县| 横峰县| 平罗县| 平舆县| 松阳县| 喀什市| 双牌县| 花莲市| 正定县| 乐亭县| 育儿| 河津市| 濉溪县| 嘉荫县| 灵石县| 应城市| 正镶白旗| 连南| 象山县| 灌云县| 台前县| 施秉县| 泸西县| 永善县| 布拖县|