详解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 相关文章推荐
JavaScript静态的动态
Sep 18 Javascript
Javascript基础教程之数据类型 (数值 Number)
Jan 18 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
Jun 19 Javascript
javascript的BOM
May 03 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
Apr 25 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
Vue.js组件通信之自定义事件详解
Oct 19 Javascript
微信小程序实现滚动加载更多的代码
Dec 06 Javascript
vue监听键盘事件的相关总结
Jan 29 Vue.js
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
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
yii操作session实例简介
2014/07/31 PHP
php获取随机数组列表的方法
2014/11/13 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
php输出图像的方法实例分析
2017/02/16 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
js 表单验证方法(实用)
2009/04/28 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
使用jquery+CSS实现控制打印样式
2014/12/31 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
将JSON字符串转换成Map对象的方法
2016/11/30 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python复数属性和方法运算操作示例
2017/07/21 Python
PyQt5每天必学之滑块控件QSlider
2018/04/20 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python如何发送与接收大型数组
2020/08/07 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5-WebSocket实现聊天室示例
2016/12/15 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
我的梦中国梦演讲稿
2014/04/23 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
公司聚餐通知
2015/04/22 职场文书
初中语文教学反思范文
2016/03/03 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书