0.30000000000000004,js0.1+0.2的结果意想不到,一行代码就能解决,浮点数,精度问题
0.1 + 0.2 = 0.30000000000000004 ???
浮点数,主要形成原因是,计算机中的所有数据都是以二进制形式存在,具体原因不在这里说了,刚开始看了别人的文章,写了好长一段,还是很牛 * 的,但是太长,有些比较简单的加减有点杀鸡用牛刀的感觉,
我用一行代码解决的方案在最底下。
别人的解决方案:
add(a, b) {//相加
var c, d, e;
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) + this.mul(b, e)) / e;
},
sub(a, b) {//相减
var c, d, e;
try {
c = a.toString().split(".")[1].length;
} catch (f) {
c = 0;
}
try {
d = b.toString().split(".")[1].length;
} catch (f) {
d = 0;
}
return e = Math.pow(10, Math.max(c, d)), (this.mul(a, e) - this.mul(b, e)) / e;
},
mul(a, b) {//主体
var c = 0,
d = a.toString(),
e = b.toString();
try {
c += d.split(".")[1].length;
} catch (f) { }
try {
c += e.split(".")[1].length;
} catch (f) { }
return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
},
div(a, b) {//除
var c, d, e = 0,
f = 0;
try {
e = a.toString().split(".")[1].length;
} catch (g) { }
try {
f = b.toString().split(".")[1].length;
} catch (g) { }
return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), this.mul(c / d, Math.pow(10, f - e));
} 用到哪个,只要mul和你用到的函数就OK
我的解决方案:我当时需要用的是任意一个数字(以a代表),每次需要加0.1。将小数 a + 0.1, 如果a有小数0.2,就会出错。
那我每次(a*10 + 1)/10 就可以解决,思路就是不让加减里出现小数,这个方案稍微有点限制,需要只有一位小数,或者有固定几位小数。
这样每次乘以10的几次幂,得出结果,再变回原来的倍数可以了。如果每次小数个数不固定,用上面的方法比较好。
如果没看懂可以联系我。

浙公网安备 33010602011771号