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     
时间: 2024-11-10 14:01:06

js 浮点运算bug的相关文章

js浮点运算的问题

问题引入:今天在前台js处理两个数字的相乘时出现了精度的偏差:1.2*3=3.9999999995,本来应该是3.6的.百度了一下,发现这是js浮点运算的一个Bug.网上找了一些对js浮点数运算的重写方法,现在把这些方法总结一下,以供遇到同样问题的朋友参考. 程序代码 1.除法函数 //调用:accDiv(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.to

JS 浮点计算BUG

最近做项目的时候遇到一个比较纠结的js浮点计算问题. 当时是做利率计算,因为利率大多数涉及到小数点,精度要求也很高. 0.6+0.1+0.1=? 结果出现:0.7999999999999 网上查找了一下,这确实是一个缺陷(Bug) 不仅加,只要涉及到浮点计算减成除一样会出现类似情况 先看看Demo: 将0.1~10,加0.1+0.1  进行测试 1 $(function () { 2 var content = ""; 3 for (var i = 0.1; i <= 10; i

js JS 浮点计算BUG

Number.prototype.toRound = function(d) { var s=this+"";if(!d)d=0; if(s.indexOf(".")==-1)s+=".";s+=new Array(d+1).join("0"); if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0,"+ (d+1) +"})?)\\d*$").test(s))

js数据计算中的一个bug,9.44+4.8计算结果竟然是14.239999999999998

在使用js计算数据时,遇到一个很奇怪的问题,9.44+4.8计算结果竟然是14.239999999999998这个??很夸张. 于是享有经验的同事请教,这是怎么回事,原来是js的bug,在减法时,经常出现,加法时出现的少,需要修正,修正方式有两种,一种是转化为整数,另一种是使用toFixed() ,还有一种方式就是给加上一个很小的数,例如0.000000001,然后在取几位小数 第一种方法:使用整数的方法: alert( (9.44*100+4.8*100)/100.0) 第二种方法:使用toF

[IE bug] ajax请求 304解决方案

最近和筒子们做了个校园电台,进去之后会自动播放歌曲,每首放完了的话会随机get新的json,然后再播放下一首 整体做成了命令行的风格,在最后输入next,start等命令来操作,5+M/s校园网+W级的曲库,最后做出来的效果还是很赞的 在同学间推广了一下,有好评咯 反馈回来的产品设计的bug 和 代码bug 也不少,最逗的一个就是 IE浏览器下,每次换出来的新歌都是一首 调试前以为是js代码在IE下运行的问题,后来发现js没有bug 打开调试工具之后,原因一下就明朗了 ajax返回结果HTTP3

javascript(js)小数精度丢失的解决方案

原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 = 0.2999999999等,下面列出可以完美求出相应精度的四种js算法 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} t

从QQ登录的js sdk中,研究html、css以及js的解耦

研究过腾讯提供的QQ登录js sdk版本(飞机票)的读者,可能会注意到,只要引入一个js,然后再设置一个span标签,就可以使用js实例化出一个QQ登录按钮来.如果你查看页面源码,会发现页面自动引入了很多个js文件,这是为什么呢?? 其实很简单,就是从你引入的这个js,会动态加载其他js或css等资源文件.这个技术并不复杂,也很常见.如果你了解chrome插件的话,你就会发现,这些插件就可以随意更改页面样式.添加各种js.css等页面资源. 咱先不说这样做有什么好处,先就跟大家分享一下我自己写的

关于js小数计算的问题

在js浮点运算中 var a=0.2-0.1; var b=0.3-0.2; console.log(a==b); 答案是什么呢,很多人可能认为是true,包括我在内,但是当我写出来运行了一下,我被答案惊呆了,上图 小伙伴们,惊呆了有木有! 然后我赶紧问度娘,然后终于找到了答案,原来js运算的时候是要转成二进制的,这样的话浮点就会有误差,0.3-0.2就是0.09999999999999998,非常近似0.1,所以a最终不等于b

我读汤姆大叔的深入理解js(二)

继续汤姆大叔的js之旅. 揭秘命名函数表达式 函数表达式和函数声明 汤姆大叔在博客中引用ECMA规范:函数声明必须带有标识符,函数表达式可以省略.对于我来说这些概念的东西真是不所适从.还是大叔的实例带劲.上实例如下: function foo(){};//鬼都知道是声明 var bar = function foo(){};//鬼也知道是表达式 new function bar(){}; (function() { function bar(){};//这也是声明 })();这些大家看看应该都很