详解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 相关文章推荐
JS加ASP二级域名转向的代码
May 17 Javascript
简单的JS多重继承示例
Mar 13 Javascript
jquery中EasyUI实现同步树
Mar 01 Javascript
每天一篇javascript学习小结(基础知识)
Nov 10 Javascript
详解javascript遍历方式
Nov 11 Javascript
JavaScript头像上传插件源码分享
Mar 29 Javascript
浅谈js中test()函数在正则中的使用
Aug 19 Javascript
AngularJS入门教程之多视图切换用法示例
Nov 02 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
js中setTimeout的妙用--防止循环超时
Mar 06 Javascript
VueJs监听window.resize方法示例
Jan 17 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
Nov 25 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
关于PHP结束标签的使用细节探讨及联想
2013/03/04 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
PHP中的session安全吗?
2016/01/22 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
Python实现的检测网站挂马程序
2014/11/30 Python
python中xrange用法分析
2015/04/15 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
Python爬豆瓣电影实例
2018/02/23 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
Python无损压缩图片的示例代码
2020/08/06 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
大型活动策划方案
2014/01/12 职场文书
小学评语大全
2014/04/22 职场文书
新教师岗前培训方案
2014/06/05 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
信仰观后感
2015/06/03 职场文书
筑梦中国心得体会
2016/01/18 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
python常见的占位符总结及用法
2021/07/02 Python
Python中with上下文管理协议的作用及用法
2022/03/18 Python
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android