js 浮点运算bug
js几个浮点运算的bug,比如6.9-1.1,7*0.8,2.1/0.3,2.2+2.1
实现思路
通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了
比如:11*(22.9*10)/10
1 <script>
2 //除法函数,用来得到精确的除法结果
3 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
4 //调用:2.1.div(0.3) 等于2.1 / 0.3
5 //返回值:this除以arg的精确结果
6 //给Number类型增加一个div方法,调用起来更加方便。
7 Number.prototype.div = function(arg) {
8 var t1 = 0,
9 t2 = 0,
10 r1, r2;
11 try { t1 = this.toString().split(".")[1].length } catch(e) {}
12 try { t2 = arg.toString().split(".")[1].length } catch(e) {}
13 with(Math) {
14 r1 = Number(this.toString().replace(".", ""))
15 r2 = Number(arg.toString().replace(".", ""))
16 return(r1 / r2) * pow(10, t2 - t1);
17 }
18 }
19 //乘法函数,用来得到精确的乘法结果
20 //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
21 //调用:7.0.mul(0.8) 等于7*0.8
22 //返回值:this乘以arg的精确结果
23 //给Number类型增加一个mul方法,调用起来更加方便。
24 Number.prototype.mul = function(arg) {
25 var m = 0,
26 s1 = this.toString(),
27 s2 = arg.toString();
28 try { m += s1.split(".")[1].length } catch(e) {}
29 try { m += s2.split(".")[1].length } catch(e) {}
30 return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
31 }
32 //加法函数,用来得到精确的加法结果
33 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
34 //调用: 2.2.add(2.1) 等于 2.2+2.1
35 //返回值:this加上arg的精确结果
36 //给Number类型增加一个add方法,调用起来更加方便。
37 Number.prototype.add = function(arg) {
38 var r1, r2, m;
39 try { r1 = this.toString().split(".")[1].length } catch(e) { r1 = 0 }
40 try { r2 = arg.toString().split(".")[1].length } catch(e) { r2 = 0 }
41 m = Math.pow(10, Math.max(r1, r2))
42 return(this * m + arg * m) / m
43 }
44 //减法函数,用来得到精确的减法结果
45 //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
46 //调用:6.9.subtr(1.1) 等于 6.9 - 1.1
47 //返回值:this减去arg的精确结果
48 //给Number类型增加一个subtr 方法,调用起来更加方便。
49 Number.prototype.subtr = function(arg) {
50 var r1, r2, m, n;
51 try { r1 = this.toString().split(".")[1].length } catch(e) { r1 = 0 }
52 try { r2 = arg.toString().split(".")[1].length } catch(e) { r2 = 0 }
53 m = Math.pow(10, Math.max(r1, r2));
54 //动态控制精度长度
55 n = (r1 >= r2) ? r1 : r2;
56 return((this * m - arg * m) / m).toFixed(n);
57 }
58 console.log("6.9 - 1.1:"+(6.9 - 1.1).toString());
59 console.log("6.9.subtr(1.1):"+6.9.subtr(1.1));
60 console.log("7*0.8:"+(7*0.8).toString());
61 console.log("7.0.mul(0.8):"+7.0.mul(0.8).toString());
62 console.log("2.1/0.3:"+(2.1/0.3));
63 console.log("2.1.div(0.3):"+2.1.div(0.3));
64 console.log("2.2+2.1:"+(2.2+2.1).toString());
65 console.log("2.2.add(2.1):"+2.2.add(2.1));
66 //通过将浮点数放大倍数到整型(最后再除以相应倍数),再进行运算操作,这样就能得到正确的结果了
67 console.log(11*(22.9*10)/10);
68 </script>
69
js 浮点运算bug的更多相关文章
- JS 浮点计算BUG
最近做项目的时候遇到一个比较纠结的js浮点计算问题. 当时是做利率计算,因为利率大多数涉及到小数点,精度要求也很高. 0.6+0.1+0.1=? 结果出现:0.7999999999999 网上查找了一 ...
- [转] iOS11.3 fastclick.js相关bug
最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...
- Js浮点运算存在精度问题
记得在某一次项目中,运用js进行一系列算数运算,计算中会存在浮点类型,就单纯的进行了计算,最后在测试过程中,主管在核对数据的时候发现计算的结果是有问题的,于是就很纳闷,在网上搜索找到了答案 ,htt ...
- 手淘移动适配方案flexible.js兼容bug处理
什么是flexible.js 移动端自适应方案 https://www.jianshu.com/p/04efb4a1d2f8 什么是rem 这个单位代表根元素的 font-size 大小(例如 元素的 ...
- js浮点运算的坑
1,js浮点型小数点运算的问题. 这么简单的计算,js竟然算的是错的,究其原因,是因为js小数在内存存储方式的原因. 具体原因: JavaScript 里的数字是采用 IEEE 754 标准的 64 ...
- js 浮点运算出现的精度丢失问题
var myf='6.202555'; myf=Number(myf).toFixed(2);//使用方法 Number.prototype.toFixed = function(scale) { v ...
- js JS 浮点计算BUG
Number.prototype.toRound = function(d) { var s=this+"";if(!d)d=0; if(s.indexOf(".&quo ...
- IE8一枝独秀的JS兼容BUG
// 例如淡入淡出的封装类文件 function ImagesEff(div,time){ this.arr=[];//装载所有div this.time=time; this.recordOld=n ...
- 163k地方门户网站系统js小Bug
163k地方门户网站系统后台在Firefox下无法通过选择区域来获取相对应的地段,IE浏览器下无些问题. Firebug提示错误为: ReferenceError: requestdataquyu i ...
随机推荐
- MySQL 回表查询 & 索引覆盖优化
回表查询 先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据 建表示例 mysql> create table user( -> id int(10) auto_incre ...
- np.random.randint()的返回值
返回的是数组而非int 比如返回x,y 为[1][2] 而非1,2 容易在只有一维一列时没有意识到 其他函数的返回值也要注意
- 鸟哥的linux私房菜——第五章学习(Linux的文件权限与目录配置)
******************第五章学习****************** 1.[重要的三个概念] 1).文件拥有者(使用者):User,该文件/文件夹只能我来读写: 2).群组:Group, ...
- mybatis(六)插件机制及分页插件原理
转载:https://www.cnblogs.com/wuzhenzhao/p/11120848.html MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要 ...
- sql-libs(2) 数字型
经测试,发现是数字型的注入,直接 and 1=1 返回正常,and1=2返回错误,感觉比第一关更加简单一点啊,,透~ 经测试order by 为 3 . 1. union 注入 http://192. ...
- 解决: "E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ..."
解决: "E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?& ...
- React Gatsby 最新教程
React Gatsby 最新教程 https://www.gatsbyjs.com/docs/quick-start/ https://www.gatsbyjs.com/docs/tutorial/ ...
- v-for & for...in vs for...of
v-for & for...in vs for...of for..in vs for...of for (const key in object) { if (Object.hasOwnPr ...
- ES6 Class vs ES5 constructor function All In One
ES6 Class vs ES5 constructor function All In One ES6 类 vs ES5 构造函数 https://developer.mozilla.org/en- ...
- LeetCode 算法题解 js 版 (001 Two Sum)
LeetCode 算法题解 js 版 (001 Two Sum) 两数之和 https://leetcode.com/problems/two-sum/submissions/ https://lee ...