您现在的位置是:技术博客 > 前端前端 JS处理高精度计算 Lucas2021-02-24 17:20【代码】783人已围观 简介给Number类型增加全局自定义属性,解决js小数位加减乘除的精度问题。 #### 一、加法 ``` Number.prototype.AccAdd = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0, pw = Math.pow(10, Math.max(l1, l2)); return (arg * pw + pw * this) / pw; }; ``` #### 二、减法 ``` Number.prototype.AccSub = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0, pw = Math.pow(10, Math.max(l1, l2)), //动态控制精度长度 l = (l1 >= l2) ? l1 : l2; return ((this * pw - arg * pw) / pw).toFixed(l); } ``` #### 三、乘法 ``` Number.prototype.AccMul = function (arg) { var pw = 0; pw += this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0; pw += arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0; return Number(arg.toString().replace(".", "")) * Number(this.toString().replace(".", "")) / Math.pow(10, pw); } ``` #### 四、除法 ``` Number.prototype.AccDiv = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0; with (Math) { r1 = Number(this.toString().replace(".", "")); r2 = Number(arg.toString().replace(".", "")); return (r1 / r2) * pow(10, l2 - l1); } } ``` #### 五、toFixed函数 ``` Number.prototype.toFixed = function (d) { console.log('okkk'); var s=this+""; if(!d)d=0; if(s.indexOf(".")==-1)s+="."; s+=new Array(d+1).join("0"); if(new RegExp("^(-|\\+)?(\\d+(\\.\\d{0,"+(d+1)+"})?)\\d*$").test(s)){ var s="0"+RegExp.$2,pm=RegExp.$1,a=RegExp.$3.length,b=true; if(a==d+2){ a=s.match(/\d/g); if(parseInt(a[a.length-1])>4){ for(var i=a.length-2;i>=0;i--){ a[i]=parseInt(a[i])+1; if(a[i]==10){ a[i]=0; b=i!=1; }else break; } } s=a.join("").replace(new RegExp("(\\d+)(\\d{"+d+"})\\d$"),"$1.$2"); }if(b)s=s.substr(1); return (pm+s).replace(/\.$/,""); } return this+""; } ``` #### 六、案例如下: ``` <!DOCTYPE html> <html> <head> <title>js高精度计算</title> <script type="text/javascript"> //给Number类型增加 加法函数 Number.prototype.AccAdd = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0, pw = Math.pow(10, Math.max(l1, l2)); return (arg * pw + pw * this) / pw; }; //给Number类型增加 减法函数 Number.prototype.AccSub = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0, pw = Math.pow(10, Math.max(l1, l2)), //动态控制精度长度 l = (l1 >= l2) ? l1 : l2; return ((this * pw - arg * pw) / pw).toFixed(l); } //给Number类型增加 乘法函数 Number.prototype.AccMul = function (arg) { var pw = 0; pw += this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0; pw += arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0; return Number(arg.toString().replace(".", "")) * Number(this.toString().replace(".", "")) / Math.pow(10, pw); } //给Number类型增加 除法函数 Number.prototype.AccDiv = function (arg) { var l1 = this.toString().indexOf('.') > 0 ? this.toString().split(".")[1].length : 0, l2 = arg.toString().indexOf('.') > 0 ? arg.toString().split(".")[1].length : 0; with (Math) { r1 = Number(this.toString().replace(".", "")); r2 = Number(arg.toString().replace(".", "")); return (r1 / r2) * pow(10, l2 - l1); } } var a = '12.04'; var b = 3.101; console.log('a = ', a); console.log('b = ', b); console.log('a + b = ', Number(a).AccAdd(Number(b))); console.log('a - b = ', Number(a).AccSub(Number(b))); console.log('a * b = ', Number(a).AccMul(Number(b))); console.log('a / b = ', Number(a).AccDiv(Number(b))); </script> </head> <body> </body> </html> ``` 转载:感谢您对Lucas个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源Lucas个人博客”。 很赞哦! ( 0 ) 上一篇:PS抠图篇 下一篇:Node.js安装和使用 相关文章 ueditor工具栏浮动bug 有趣的js插件 动态DOM的事件绑定 推荐一个炫酷的背景插件 点击排行 生活不止眼前的苟且,还有诗和远方 十年一觉电影梦 奥地利基茨比厄尔 禅修治愈身心 自律成就自我 零边际成本社会 Modern PHP 鸟哥的Linux私房菜 本栏推荐 要技术,更要有创意 定时任务 Curl无法发送https请求 Lnmp环境搭建 常用的SQL函数 Windows的cmd指令 ueditor工具栏浮动bug 有趣的js插件 标签云 git laravel swoole javascript vue ajax html css sql linux docker flask django nginx apache thinkphp markdown sublime wechat layui photoshop nodejs mysql windows composer java maven springboot mybatis IDE 猜你喜欢 Swoole 基础篇一(初识) PHP进程管理器 正则的快速上手 Sublime代码格式化 Lnmp环境搭建 高并发库存防控超量 Linux之top命令 常用的SQL函数 站点信息 建站时间:2018-05-01 在线人数:1人 文章统计:263篇 总浏览量:222653次 统计数据:百度统计 个人信息:扫描二维码查看