详解js加减乘除精确计算


Posted in Javascript onMarch 19, 2019

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

Javascript 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
jQuery AjaxQueue改进步骤
Oct 06 Javascript
对 jQuery 中 data 方法的误解分析
Jun 18 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
JQuery实现的按钮倒计时效果
Dec 23 Javascript
用jQuery获取table中行id和td值的实现代码
May 19 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
js + css实现标签内容切换功能(实例讲解)
Oct 09 Javascript
vue修改对象的属性值后页面不重新渲染的实例
Aug 09 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
ES6字符串的扩展实例
Dec 21 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
Mar 19 #jQuery
浅谈JavaScript_DOM学习篇_图片切换小案例
Mar 19 #Javascript
vue多层嵌套路由实例分析
Mar 19 #Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
Mar 19 #Javascript
vue项目移动端实现ip输入框问题
Mar 19 #Javascript
详解使用React.memo()来优化函数组件的性能
Mar 19 #Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
Mar 19 #Javascript
You might like
用mysql内存表来代替php session的类
2009/02/01 PHP
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
Javascript 正则表达式校验数字的简单实例
2016/11/02 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Python如何存储数据到json文件
2020/03/09 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
自行车租赁公司创业计划书
2014/01/28 职场文书
个人委托书范本
2014/04/02 职场文书
投资意向书
2014/07/30 职场文书
班主任寄语2015
2015/02/26 职场文书
矛盾论读书笔记
2015/06/29 职场文书
学习党史心得体会2016
2016/01/23 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python