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. cmath取整函数

    #include <iostream> #include <cmath>//头文件 using namespace std; int main () { double n; c ...

  2. HTTP的传输编码(Transfer-Encoding:chunked) / net::ERR_INVALID_CHUNKED_ENCODING

    https://blog.csdn.net/m0_37668842/article/details/89138733 https://www.cnblogs.com/jamesvoid/p/11297 ...

  3. PowerShell随笔1---背景

    既然是随笔,那就想到什么说什么,既会分享主题知识,也会分享一些其他技巧和个人学习方法,供交流. 我一般学习一个东西,我都会问几个问题: 这东西是什么? 这东西有什么用,为什么会出现,出现是为了解决什么 ...

  4. Python:装饰器是如何调用的

    应用举例:(1)装饰器 # 装饰器的调用: # 一旦用上装饰器会: # 第一步:调outer函数 # 第二步:被装饰的函数play_game会被当作参数fn给outer # 第三步:最后调用play_ ...

  5. Redis内存管理中的LRU算法

    在讨论Redis内存管理中的LRU算法之前,先简单说一下LRU算法: LRU算法:即Least Recently Used,表示最近最少使用页面置换算法.是为虚拟页式存储管理服务的,是根据页面调入内存 ...

  6. XSS脚本汇总

    (1)普通的XSS JavaScript注入<SCRIPT SRC=http://***/XSS/xss.js></SCRIPT> (2)IMG标签XSS使用JavaScrip ...

  7. CSS3 动态生成内容(在Web中插入内容)====CSS的伪类或者伪元素

    # css3 .类:伪类::伪元素 /* CSS3伪元素/伪类 :https://www.w3.org/TR/css3-selectors/#selectors ::selection 伪元素(F12 ...

  8. TypeScript with React

    TypeScript with React # Make a new directory $ mkdir react-typescript # Change to this directory wit ...

  9. Flatten Arrays & flat() & flatMap()

    Flatten Arrays & flat() & flatMap() https://alligator.io/js/flat-flatmap/ "use strict&q ...

  10. React Hooks & Context API

    React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...