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 ...
随机推荐
- java——API
API定义: 可以网上下载一个jdk_api文档用来查找一些函数. 匿名对象的创建 匿名对象做为返回值和参数实例: Random的使用:
- 牛客编程巅峰赛S1第3场 - 青铜&白银 C.牛牛晾衣服(二分)
题意:有\(n\)件衣服,每件衣服都有\(a_{i}\)滴水,所有衣服每分钟都能自然烘干\(1\)滴水,或者用烘干机,每分钟可以烘干\(k\)滴水,问最快多少分钟可以使所有衣服都烘干. 题解:这题和之 ...
- java的两性
java具有解释与编译两种特性 本来是昨天的,可以文件丢失了......(我没有偷懒哦,没有!) 所以凭记忆随便写了点 解释就像直接翻译一本书拿给别人看,编译就像找个翻译官一句句翻译给你t听 解释型( ...
- win7 & centos7 双系统安装方法
1.准备 1)Centos7镜像 官方:https://www.centos.org/ 阿里镜像:http://mirrors.aliyun.com/centos/ 2)安装windows7系统的电脑 ...
- centos 7下安装配置Supervisor
1.安装Supervisor centos下安装yum install supervisor 2. systemctl enable supervisord 开机自启 systemctl start ...
- 关于HashMap遍历,为什么要用entry
Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Va ...
- Netty(五)Netty 高性能之道
4.背景介绍 4.1.1 Netty 惊人的性能数据 通过使用 Netty(NIO 框架)相比于传统基于 Java 序列化+BIO(同步阻塞 IO)的通信框架,性能提升了 8 倍多.事 实上,我对这个 ...
- Spring(四) SpringDI(1)
Spring 自动装配之依赖注入 依赖注入发生的时间 当 Spring IOC 容器完成了 Bean 定义资源的定位.载入和解析注册以后,IOC 容器中已经管理类 Bean 定义的相关数据,但是此时 ...
- 大数据开发--Hbase协处理器案例
大数据开发--Hbase协处理器案例 1. 需求描述 在社交网站,社交APP上会存储有大量的用户数据以及用户之间的关系数据,比如A用户的好友列表会展示出他所有的好友,现有一张Hbase表,存储就是当前 ...
- React Hooks: useReducer All In One
React Hooks: useReducer All In One useReducer https://reactjs.org/docs/hooks-reference.html#usereduc ...