JS浮点数运算Bug的解决办法
方法一:重写浮点运算的函数
//除法函数,用来得到精确的除法结果 //说明: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的解决办法相关推荐
- JS浮点数运算Bug的解决办法(转自百度文库)
37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只 ...
- ie6 7 8下的一些bug和解决办法
1:li边距"无故"增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑 ...
- Dumpzilla工具第615行bug的解决办法
Dumpzilla工具第615行bug的解决办法 在Dumpzilla使用选项frequency时,会提示SQL语法错误.这是由于其中SQL语句编写错误.需要将615行中: where url lik ...
- css文本省略(······)行高错位(bug)- 解决办法
应用css文本省略(······)属性:-webkit-line-clamp: 3; 导致:行高错位.(F12查看发现css属性line-height的值并没变,但为什么浏览器显示文本的实际行距却变小 ...
- eclipse中js中文乱码问题的解决办法
eclipse中js中文乱码问题的解决办法 参考文章: (1)eclipse中js中文乱码问题的解决办法 (2)https://www.cnblogs.com/yanggb/p/11719126.ht ...
- js浮点数运算不精确 如何解决_解决 浏览器处理数字运算时精度丢失的方法
浏览器处理数字运算时精度丢失的方法 为什么0.1 + 0.2 不等于0.3.因为计算机不能精确表示0.1, 0.2这样的浮点数,计算时使用的是带有舍入误差的数 并不是所有的浮点数在计算机内部都存在舍入 ...
- ieee754浮点数转换工具_关于JS浮点数运算不精确的原因和解决方案
背景 之前在一个项目中,涉及到了金额,协议组定的标准是按照分的单位进行传递的,但是交互上,web页面中为了更友好的体验,是使用的元作为单位的,这个时候就需要转换一下单位 本来是很简单的一个转化的需求, ...
- 浏览器常见bug及解决办法
常见的bug列表: IE6下,当块级元素 margin与float同方向时,margin会加倍 例如 .box{float:left;margin-left:10px;}在IE6下表现的marg ...
- IE6 遇到bug及解决办法
一.IE6 双倍边距 bug 当页面上的元素使用 float 浮动时,不管是向左还是向右浮动;只要该元素带有 margin 像素都会使该值乘以 2,例如"margin-left:10px&q ...
最新文章
- linux shell 通过 第三方 网站 网页 得到 外网 公网 ip
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application )
- FPGA篇(十一)modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法 (转)
- 元宇宙iwemeta: 元宇宙与数字经济
- 测试socket udp 单次传输数据上限(sendto()函数data不能超过65507字节。udp头占8字节,ip头占20字节,加起来正好65535字节)
- jquery设置表单元素只读_jquery设置元素readonly与disabled属性
- [Cocos2d-x For WP8]Scene场景
- 前端学习(1578):React简介
- 苹果考虑3月8日或前后发布5G iPhone SE
- 《learn objective-c on the Mac for OS X and IOS》译名《objective-C基础教程》
- mysql datapump_mysqlpump参数详解
- java中序列化一个对象保存在文件中的简单过程
- Java 生成随机数并进行查找
- Android - BGAQRCode 扫描二维码生成二维码
- 基于51单片机自行车码表霍尔测速里程显示超速报警方案原理图设计
- win10电脑任务栏突然卡死解决办法
- 格兰杰因果( Granger causality test)在神经科学中脑区功能连接上的应用
- Python 实现 PDF转图片 图片转PDF
- 钻石DIAMOND一词来源于古法文DIAMAUND钻石
- iOS和android游戏纹理优化和内存优化(cocos2d-x)
热门文章
- 使用JMS实现请求/应答程序
- 5G研发大幕开启 终端硝烟已燃
- 生产环境elasticsearch5.0.1和6.3.2集群的部署配置详解
- 【转】 [C/OC的那点事儿]NSMutableArray排序的三种实现(依赖学生成绩管理系统).
- 虚拟网卡与物理网卡TCP协议数据传输对比
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—异步编程(九)
- 网络中最常用的网络命令(2)-完整参数
- ci 文件类型在禁止上传之列
- 剑指Offer——网易笔试之解救小易
- java面试题(开发框架)