方法一:重写浮点运算的函数

//除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
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 (r1 / r2) * pow(10, t2 - t1);}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function(arg) {return accDiv(this, arg);
}
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
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)
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function(arg) {return accMul(arg, this);
}
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
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
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function(arg) {return accAdd(arg, this);
}
//减法函数,用来得到精确的减法结果
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSubtr(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSubtr(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);
}
//给Number类型增加一个subtr 方法,调用起来更加方便。
Number.prototype.subtr = function(arg) {return accSubtr(arg, this);
}

在你要用的地方包含这些函数,然后调用它来计算就可以了。 
比如你要计算:7*0.8 ,则改成 (7).mul(8) 
其它运算类似,就可以得到比较精确的结果。
------------------------------------------------------------------------------------------------------

方法二:放大倍数再运算

//如果在知道小数位个数的前提下,可以考虑通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了

<script>alert(11 * (22.9 * 10) / 10);
</script>

转载于:https://www.cnblogs.com/ziyoublog/p/9153943.html

JS浮点数运算Bug的解决办法相关推荐

  1. JS浮点数运算Bug的解决办法(转自百度文库)

    37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)  我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998  怎么会这样,两个只 ...

  2. ie6 7 8下的一些bug和解决办法

    1:li边距"无故"增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑 ...

  3. Dumpzilla工具第615行bug的解决办法

    Dumpzilla工具第615行bug的解决办法 在Dumpzilla使用选项frequency时,会提示SQL语法错误.这是由于其中SQL语句编写错误.需要将615行中: where url lik ...

  4. css文本省略(······)行高错位(bug)- 解决办法

    应用css文本省略(······)属性:-webkit-line-clamp: 3; 导致:行高错位.(F12查看发现css属性line-height的值并没变,但为什么浏览器显示文本的实际行距却变小 ...

  5. eclipse中js中文乱码问题的解决办法

    eclipse中js中文乱码问题的解决办法 参考文章: (1)eclipse中js中文乱码问题的解决办法 (2)https://www.cnblogs.com/yanggb/p/11719126.ht ...

  6. js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法

    浏览器处理数字运算时精度丢失的方法 为什么0.1 + 0.2 不等于0.3.因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数 并不是所有的浮点数在计算机内部都存在舍入 ...

  7. ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案

    背景 之前在一个项目中,涉及到了金额,协议组定的标准是按照分的单位进行传递的,但是交互上,web页面中为了更友好的体验,是使用的元作为单位的,这个时候就需要转换一下单位 本来是很简单的一个转化的需求, ...

  8. 浏览器常见bug及解决办法

    常见的bug列表: IE6下,当块级元素   margin与float同方向时,margin会加倍  例如 .box{float:left;margin-left:10px;}在IE6下表现的marg ...

  9. IE6 遇到bug及解决办法

    一.IE6 双倍边距 bug 当页面上的元素使用 float 浮动时,不管是向左还是向右浮动;只要该元素带有 margin 像素都会使该值乘以 2,例如"margin-left:10px&q ...

最新文章

  1. linux shell 通过 第三方 网站 网页 得到 外网 公网 ip
  2. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application )
  3. FPGA篇(十一)modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法 (转)
  4. 元宇宙iwemeta: 元宇宙与数字经济
  5. 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)
  6. jquery设置表单元素只读_jquery设置元素readonly与disabled属性
  7. [Cocos2d-x For WP8]Scene场景
  8. 前端学习(1578):React简介
  9. 苹果考虑3月8日或前后发布5G iPhone SE
  10. 《learn objective-c on the Mac for OS X and IOS》译名《objective-C基础教程》
  11. mysql datapump_mysqlpump参数详解
  12. java中序列化一个对象保存在文件中的简单过程
  13. Java 生成随机数并进行查找
  14. Android - BGAQRCode 扫描二维码生成二维码
  15. 基于51单片机自行车码表霍尔测速里程显示超速报警方案原理图设计
  16. win10电脑任务栏突然卡死解决办法
  17. 格兰杰因果( Granger causality test)在神经科学中脑区功能连接上的应用
  18. Python 实现 PDF转图片 图片转PDF
  19. 钻石DIAMOND一词来源于古法文DIAMAUND钻石
  20. iOS和android游戏纹理优化和内存优化(cocos2d-x)

热门文章

  1. 使用JMS实现请求/应答程序
  2. 5G研发大幕开启 终端硝烟已燃
  3. 生产环境elasticsearch5.0.1和6.3.2集群的部署配置详解
  4. 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
  5. 虚拟网卡与物理网卡TCP协议数据传输对比
  6. ASP.NET温故而知新学习系列之ASP.NET多线程编程—异步编程(九)
  7. 网络中最常用的网络命令(2)-完整参数
  8. ci 文件类型在禁止上传之列
  9. 剑指Offer——网易笔试之解救小易
  10. java面试题(开发框架)