javascript小数精度丢失的完美解决方法


Posted in Javascript onMay 31, 2016

原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况.

javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 = 0.2999999999等,下面列出可以完美求出相应精度的四种js算法

function accDiv(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){}  
 with(Math){  
 r1=Number(arg1.toString().replace(".",""))  
 r2=Number(arg2.toString().replace(".","")) 
 return accMul((r1/r2),pow(10,t2-t1));  
 }  
 }  /* 何问起 hovertree.com */
 //乘法 
 function accMul(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 accAdd(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 Subtr(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); 
}

以上这篇javascript小数精度丢失的完美解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在JavaScript中通过URL传递汉字的方法
Apr 09 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
Feb 10 Javascript
jquery自定义插件——window的实现【示例代码】
May 06 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
Dec 07 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 Javascript
细说webpack6 Babel的使用详解
Sep 26 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
Nov 04 Javascript
vue3.0实现插件封装
Dec 14 Vue.js
node.js 基于 STMP 协议和 EWS 协议发送邮件
Feb 14 Javascript
详解JavaScript中的执行上下文及调用堆栈
Apr 29 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 #Javascript
javascript基本语法
May 31 #Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 #Javascript
通用无限极下拉菜单的实现代码
May 31 #Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
May 30 #Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 #Javascript
JavaScript中的操作符类型转换示例总结
May 30 #Javascript
You might like
php.ini 中文版
2006/10/28 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Javascript实现的分页函数
2007/02/07 Javascript
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python实现类继承实例
2014/07/04 Python
python调用API实现智能回复机器人
2018/04/10 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
优秀生推荐信范文
2013/11/28 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
班级寄语大全
2014/04/10 职场文书
施工安全生产承诺书
2014/05/23 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
Python机器学习之基础概述
2021/05/19 Python
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang