1. //用于替换原有的toFixed,解决精度误差问题
  2. Number.prototype.myToFixed=function(s){
  3. if(s == null){s = 0;}
  4. var value = Math.pow(10,s);//Math.pow(x,y)返回 x 的 y 次幂的值,即10的len次方的值
  5. //javascript的加减乘除结果会有误差,使用自定义方法
  6. var returnStr = Math.round(this.mul(value)).div(value).toString();
  7. //var returnStr=(parseInt(this * value + 0.5)/ value).toString();
  8. var pointIndex = returnStr.indexOf(".");
  9. if(pointIndex < 0 && s > 0){//如果没有小数点,先添加小数点,再补0
  10. returnStr = returnStr + ".";
  11. for(i = 0; i < s; i++){
  12. returnStr = returnStr + "0";
  13. }
  14. }else {
  15. var weishu = returnStr.length - 1 - pointIndex;
  16. for(i = 0; i < ( s - weishu ); i++){//如果有小数点,直接补缺少的0
  17. returnStr = returnStr + "0";
  18. }
  19. }
  20. return returnStr;
  21. }
  1. //乘法函数,用来得到精确的乘法结果
  2. //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
  3. //调用:accMul(arg1,arg2)
  4. //返回值:arg1乘以arg2的精确结果
  5. function accMul(arg1, arg2) {
  6. var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
  7. try { m += s1.split(".")[1].length } catch (e) { }
  8. try { m += s2.split(".")[1].length } catch (e) { }
  9. return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
  10. }
  11. //用法:
  12. //给Number类型增加一个mul方法,调用起来更加方便。
  13. Number.prototype.mul = function (arg) {
  14. return accMul(this,arg);
  15. }
  1. //除法函数,用来得到精确的除法结果
  2. //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
  3. //调用:accDiv(arg1,arg2)
  4. //返回值:arg1除以arg2的精确结果
  5. function accDiv(arg1, arg2) {
  6. var t1 = 0, t2 = 0, r1, r2;
  7. try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
  8. try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
  9. with (Math) {
  10. r1 = Number(arg1.toString().replace(".", ""))
  11. r2 = Number(arg2.toString().replace(".", ""))
  12. return (r1 / r2) * pow(10, t2 - t1);
  13. }
  14. }
  15. //用法:
  16. //给Number类型增加一个div方法,调用起来更加方便。
  17. Number.prototype.div = function (arg) {
  18. return accDiv(this,arg);
  19. }
  1. //加法函数,用来得到精确的加法结果
  2. //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
  3. //调用:accAdd(arg1,arg2)
  4. //返回值:arg1加上arg2的精确结果
  5. function accAdd(arg1, arg2) {
  6. var r1, r2, m;
  7. try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
  8. try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
  9. m = Math.pow(10, Math.max(r1, r2))
  10. return (arg1 * m + arg2 * m) / m
  11. }
  12. //用法:
  13. //给Number类型增加一个add方法,调用起来更加方便。
  14. Number.prototype.add = function (arg) {
  15. return accAdd(arg, this);
  16. }
  1. //减法函数,用来得到精确的减法结果
  2. function Subtr(arg1, arg2) {
  3. var r1, r2, m, n;
  4. try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
  5. try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
  6. m = Math.pow(10, Math.max(r1, r2));
  7. //last modify by deeka
  8. //动态控制精度长度
  9. n = (r1 >= r2) ? r1 : r2;
  10. return ((arg1 * m - arg2 * m) / m).toFixed(n);//这里竟然用了toFixed
  11. }

计算尽量少在页面用js计算,尽量在后台计算,实在要用js又不想有误差,就可以上面的方法了。

解决javascript加减乘除及toFixed的误差问题的更多相关文章

  1. WebAssembly是解决JavaScript 痼疾的银弹?

    写在前面 <没有银弹>是 Fred Brooks 在 1987 年所发表的一篇关于软件工程的经典论文.该论文的主要论点是,没有任何一项技术或方法可以能让软件工程的生产力在十年内提高十倍. ...

  2. 爬虫学习(十八)——selenium解决javascript渲染

    selenium 是一个用于Web应用程序测试的工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fir ...

  3. 解决JavaScript中构造函数浪费内存的问题!

    解决JavaScript中构造函数浪费内存的问题! 把构造函数中的公共的方法放到构造函数的原型对象上! // 构造函数的问题! function Gouzaohanshu(name, age, gen ...

  4. javascript的加减乘除结果会有误差,在两个浮点数相加的时候会比较明显。以下函数返回较为精确的计算结果

    加法函数(返回值:arg1加arg2的精确结果  ) function accAdd (arg1, arg2) { var r1, r2, m, c try { r1 = arg1.toString( ...

  5. 如何解决JavaScript中0.1+0.2不等于0.3

    console.log(0.1+0.2===0.3)// true or false?? 在正常的数学逻辑思维中,0.1+0.2=0.3这个逻辑是正确的,但是在JavaScript中0.1+0.2!= ...

  6. 解决JavaScript浮点数(小数) 运算出现Bug的方法

    解决JS浮点数(小数) 运算出现Bug的方法例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, ...

  7. 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ...

  8. 解决javascript动态改变img的src属性图片不显示问题

    首先讲下这个bug的出现的情况,页面中有<a href="JavaScript:void(0)" onclick="document.getElementById( ...

  9. 基于visual Studio2013解决C语言竞赛题之0419误差控制

       题目 解决代码及点评 /************************************************************************/ /* 19 ...

随机推荐

  1. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

  2. myBatis自动生成相关代码文件配置(Maven)

    pom.xml文件添加配置 <build> <finalName>generator</finalName> <plugins> <!-- mav ...

  3. Netsharp介绍

    1.1     Netsharp是什么 Netsharp定义: Netsharp业务基础平台 = 1.系统框架 + 2.元数据 + 3.平台工具 + 4.基础业务 + 5.二次开发 此五个概念请参考什 ...

  4. SharedPreferences实现记住密码功能

    SharedPerferences 简单介绍 用于保存简单的键值对数据: 它将数据放在 /data/data/<package name>/shared_prefs目录下,用xml文件保存 ...

  5. [bzoj 3226]校门外的区间

    题意 输出最后的集合   题解 校门外的树会做吧 区间知道是什么东西吧 校门外的区间会做了吧 昨天做个大线段树没做出来,今天做个小线段树压压惊 py一下输入数据,然后操作变成: U 区间涂1 I 两侧 ...

  6. Leetcode#145 Binary Tree Postorder Traversal

    原题地址 递归写法谁都会,看看非递归写法. 对于二叉树的前序和中序遍历的非递归写法都很简单,只需要一个最普通的栈即可实现,唯独后续遍历有点麻烦,如果不借助额外变量没法记住究竟遍历了几个儿子.所以,最直 ...

  7. go lang学习笔记——channel机理及调度理解

    <Go语言编程>一书介绍了libtask库,可以认为这个库等同于go的底层goroutine实现. libtask库的channel的数据结构如下: struct Alt { Channe ...

  8. asp.net 分布式缓存

    之前Velocity已被 集成到App Fabric(包含有WCF监控==)中.   网络Velocity使用大多是针对老版本:  老版本的下载地址:  http://www.microsoft.co ...

  9. 小试牛刀MVC简单网页

    上次我们创建了第一个MVC的网站,没用下,这次就简单来运行下,首先大家要去理解下MVC模式到底什么关系.在这里我就不多说,直接创建一个网页,用来显示一些数据,数据库的话我就先简单用这样创建先,为了方便 ...

  10. Nginx使用webbench进行压力测试(转载)

    在运维工作中,压力测试是一项非常重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验. 但是,在压力测试中存在一个共性,那就是压力测试的 ...