详解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  THIS详解 面向对象
Mar 25 Javascript
Jquery选择子控件"大于号"和" "区别介绍及使用示例
Jun 25 Javascript
jquery选择器之属性过滤选择器详解
Jan 27 Javascript
使用jQuery和PHP实现类似360功能开关效果
Feb 12 Javascript
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
JS实现同时搜索百度和必应的方法
Jan 27 Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
May 30 Javascript
jQuery基于排序功能实现上移、下移的方法
Nov 26 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
May 17 Javascript
jquery.validate.js 多个相同name的处理方式
Jul 10 jQuery
JQuery的加载和选择器用法简单示例
May 13 jQuery
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
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
innerText 使用示例
2014/01/23 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
Vee-Validate的使用方法详解
2017/09/22 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
js实现录音上传功能
2019/11/22 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
Python入门之modf()方法的使用
2015/05/15 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
学习之星事迹材料
2014/05/17 职场文书
运动会方阵口号
2014/06/07 职场文书
预防传染病方案
2014/06/14 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
公司经营目标责任书
2015/01/29 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技