详解js加减乘除精确计算

 更新时间:2019年03月19日 10:29:22   作者:thelongmarch  
这篇文章主要介绍了js加减乘除精确计算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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加减乘除精确计算详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • js获取下拉列表的值和元素个数示例

    js获取下拉列表的值和元素个数示例

    这篇文章主要介绍了js获取下拉列表的值和元素个数示例,需要的朋友可以参考下
    2014-05-05
  • javascript函数命名的三种方式及区别介绍

    javascript函数命名的三种方式及区别介绍

    下面小编就为大家带来一篇javascript函数命名的三种方式及区别介绍。小编觉得挺不错的,现在分享给大家,给大家做个参考。一起跟随小编过来看看吧
    2016-03-03
  • 关于JS管理作用域的问题

    关于JS管理作用域的问题

    本篇文章中,小编为大家介绍关于JS管理作用域的问题,有需要的朋友可以关注一下
    2013-04-04
  • Javascript WebSocket使用实例介绍(简明入门教程)

    Javascript WebSocket使用实例介绍(简明入门教程)

    网络套接字是下一代WEB应用程序双向通信技术,它是基于一个独立的socket并且需要客户端浏览器支持HTML5
    2014-04-04
  • 解析JavaScript的ES6版本中的解构赋值

    解析JavaScript的ES6版本中的解构赋值

    这篇文章主要介绍了解析JavaScript的ES6版本中的解构赋值,ES6版本为JS带来了诸多简化方面的改进,需要的朋友可以参考下
    2015-07-07
  • Javascript基础教程之变量

    Javascript基础教程之变量

    大家都知道javascript是可以隐式声名变量的。但要注意,隐式声名变量总是被创建为全局变量。看以下代码,情愿javascript语言强制声明变量。建议大家一定要var声明变量。
    2015-01-01
  • 深入理解JavaScript中的对象

    深入理解JavaScript中的对象

    这篇文章主要介绍了深入理解JavaScript中的对象,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • javascript prototype原型详解(比较基础)

    javascript prototype原型详解(比较基础)

    prototype原型是javascript中特别重要的概念,属于必须要掌握,如果没有良好的掌握的话,进一步用好或者学好js基本是不可能的实现的事情,并且此概念稍有难度,可能对于初次接触的朋友来说有点困难,下面就通过代码实例简单介绍一下prototype原型的用法
    2016-12-12
  • 在浏览器中打开或关闭JavaScript的方法

    在浏览器中打开或关闭JavaScript的方法

    这篇文章主要介绍了在浏览器中打开或关闭JavaScript的方法,由于历史遗留问题,JS在目前任何浏览器中都是标配...所以不想加载JS也可以选择关闭,需要的朋友可以参考下
    2015-06-06
  • 浅谈JavaScript 框架分类

    浅谈JavaScript 框架分类

    本文简单介绍了javascript的5种框架分类,以及框架特征的相关资料,有需要的童鞋们可以参考下
    2014-11-11

最新评论