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. SSM框架整合(Spring + SpringMVC + MyBatis)

    搭建环境 使用Spring(业务层)整合其他的框架SpringMVC(表现层)和MyBatis(持久层) Spring框架 创建数据库表 CREATE DATABASE ssm; USE ssm; C ...

  2. 微服务架构Day02-SpringBoot日志slf4j

    日志框架 日志门面(接口,日志抽象层 ) 日志实现 JCL(Jakarta Commons Logging).slf4j(Simple Logging Facade for Java).jboss-l ...

  3. 牛客网多校第4场 J Hash Function 【思维+并查集建边】

    题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...

  4. select(),fd_set(),fd_isset()

    1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...

  5. Java中输出小数点后几位

    笔试时候,遇到让你写输出小数点后几位,当时很是头疼,下来后,查了查发现,没什么难的.网上有各种情况都讨论了(一般分为4种),在这里我着重讨论一下比较实用,比较简单,比较方便操作的几种: 1 publi ...

  6. HDU 4628 Pieces(状压DP)题解

    题意:n个字母,每次可以删掉一组非连续回文,问你最少删几次 思路:把所有回文找出来,然后状压DP 代码: #include<set> #include<map> #includ ...

  7. 快速计算类似斐波那契数列数列的数列的第N项,矩阵快速幂

    这个题有循环节,可以不用这么做,这个可以当一个模板 #include <iostream> #include <cstdio> using namespace std; typ ...

  8. angular-2-tutorial-2017

    # angular-2-tutorial-2017https://www.sitepoint.com/understanding-component-architecture-angular/http ...

  9. CORS All In One

    CORS All In One 跨域资源共享 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS CORS 请求类型 简单请求 预检请求 Ac ...

  10. SQL All In One

    SQL All In One Structured Query Language SQL is an ANSI (American National Standards Institute) stan ...