js⼩数运算出现多位⼩数如何解决
和⼤家分享⼀个有趣的测试:vim编辑器的三种模式
0.1+0.2 == 0.3 //false
顿时郁闷,好吧!原来0.1+0.2变成:0.30000000000000004
再来⼀个 2.4/0.8 =>2.9999999999999996 没办法换种⽅式,都转换成整数 (2.4 * 100)/(0.8 * 100)
10.22 现在要减去 0.11 结果值⼜出现了很多的⼩数 10.110000000000001,然后我就⽤了 toFixed ⽅法来过滤⼩数,但是不知道跟前⾯那种转换成整数后再执⾏哪种效率⾼,好!还是试下再说吧!
var date1 = new Date();
for(var i = 0; i < 10000; i++){
var result1 = (10.22 - 0.11).toFixed(2);
}
alert(new Date() - date1);//效率低
数据库结构的基础是var date2 = new Date();
for(var j = 0; j < 10000; j++){
var result2 = (10.22 * 1000 - 0.11 * 1000) / 1000;
}
alert(new Date() - date2);//效率⾼
alert(0.1 + 0.2 == 0.3); //既然返回false
alert(0.1 + 0.2); //既然返回0.30000000000000004
alert(parseFloat(0.1) + parseFloat(0.2)); //还是返回0.30000000000000004
查了⼀些资料,⼀是 JavaScript 浮点数计算的 Bug,另⼀个是和计算机最终转换成⼆进制计算有关系,但是为什么不是所有⼩数都会有这种现象,⽬前我也不清楚,有时间再去深⼊研究⼀下。
解决⽅法:解决这种问题两种⽅法,第⼀种就是利⽤JavaScript 的toFixed(n) ⽅法,直接获取N 位⼩数,不过,个⼈觉得这种⽅法在数据精度上会有⼀些问题。如果数据精度要求不⾼的话可以使⽤。
下载文件js
alert((0.1 + 0.2).toFixed(1));
第⼆种⽅法就是⾃⼰编写运算⽅法。以下是⾃定义加法函数,使⽤此⽅法进⾏相加会避免上⾯问题。
//⾃定义加法运算
function addNum (num1, num2) {
var sq1,sq2,m;
try {
sq1 = String().split(".")[1].length;
}
catch (e) {
sq1 = 0;
}
try {
sq2 = String().split(".")[1].length;
易语言传奇自动捡物}
catch (e) {
sq2 = 0;
}
m = Math.pow(10,Math.max(sq1, sq2));
return (num1 * m + num2 * m) / m;
毕业论文模板范文}
alert(addNum(0.1, 0.2));
当然,简单⼀点也可以写成:alert((num * 3 + 10 * 3) /3); 这样也不会出现 N 多位⼩数。
python入门教程(非常详细)书
alert((num * 3 + 10 * 3) /3); 与 alert(num + 10); 这两种写法计算机在底层转换成⼆进制运算是有区别的,或许这就是出现上述问题的原因,还有待我们去深⼊研究,⼤家可以多多讨论。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。