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的更多相关文章

  1. JS 浮点计算BUG

    最近做项目的时候遇到一个比较纠结的js浮点计算问题. 当时是做利率计算,因为利率大多数涉及到小数点,精度要求也很高. 0.6+0.1+0.1=? 结果出现:0.7999999999999 网上查找了一 ...

  2. [转] iOS11.3 fastclick.js相关bug

    最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...

  3. Js浮点运算存在精度问题

    记得在某一次项目中,运用js进行一系列算数运算,计算中会存在浮点类型,就单纯的进行了计算,最后在测试过程中,主管在核对数据的时候发现计算的结果是有问题的,于是就很纳闷,在网上搜索找到了答案  ,htt ...

  4. 手淘移动适配方案flexible.js兼容bug处理

    什么是flexible.js 移动端自适应方案 https://www.jianshu.com/p/04efb4a1d2f8 什么是rem 这个单位代表根元素的 font-size 大小(例如 元素的 ...

  5. js浮点运算的坑

    1,js浮点型小数点运算的问题. 这么简单的计算,js竟然算的是错的,究其原因,是因为js小数在内存存储方式的原因. 具体原因: JavaScript 里的数字是采用 IEEE 754 标准的 64 ...

  6. js 浮点运算出现的精度丢失问题

    var myf='6.202555'; myf=Number(myf).toFixed(2);//使用方法 Number.prototype.toFixed = function(scale) { v ...

  7. js JS 浮点计算BUG

    Number.prototype.toRound = function(d) { var s=this+"";if(!d)d=0; if(s.indexOf(".&quo ...

  8. IE8一枝独秀的JS兼容BUG

    // 例如淡入淡出的封装类文件 function ImagesEff(div,time){ this.arr=[];//装载所有div this.time=time; this.recordOld=n ...

  9. 163k地方门户网站系统js小Bug

    163k地方门户网站系统后台在Firefox下无法通过选择区域来获取相对应的地段,IE浏览器下无些问题. Firebug提示错误为: ReferenceError: requestdataquyu i ...

随机推荐

  1. Codeforces Round #660 (Div. 2) Uncle Bogdan and Country Happiness dfs

    题目链接:Uncle Bogdan and Country Happiness 题意: t组输入,每组数据输入如下 首先一个n代表有n个城市,所有城市总人数为m,后面输入pi表示第i个城市的居住人数, ...

  2. 桶排序 && leetcode 41

    桶排序 对于0-1000 ,用1001个桶  简单版 或者用10个桶0-9,先按各位装桶,然后依(桶)次放回,然后再按十位放桶,放回,然后百位. 也就是基数排序 https://www.cnblogs ...

  3. CodeForces - 803C Maximal GCD 【构造】

    You are given positive integer number n. You should create such strictly increasing sequence of k po ...

  4. Leetcode(145)-二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 思路:一开始编写二叉树后序遍历的程序,感觉定级为困难有点欠妥,确实,如果用 ...

  5. C# 类(3)

    方法重载 和python类似,在调用函数的时候可以指定默认参数,car("Jeep",color="red") 方法重载就是 可以定义几个同名的函数,然后带有不 ...

  6. HTML5 dataset All In One

    HTML5 dataset All In One dataset https://developer.mozilla.org/en-US/docs/Web/API/HTMLOrForeignEleme ...

  7. you don't know github

    you don't know GitHub <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  8. HTML5 Template in Action

    HTML5 Template in Action https://developer.mozilla.org/es/docs/Web/HTML/Elemento/template https://de ...

  9. js & touch & swiper

    js & touch & swiper https://developer.mozilla.org/en/docs/Web/API/Touch_events "use str ...

  10. React & Dva & Actions & dispatch & effects

    React & Dva & Actions & dispatch & effects dispatch https://dvajs.com/guide/introduc ...