一、遇到得问题:
0.1+0.2 = 0.30000000000000004
二、产生原因:
因为在输入内容进行转换的时候,二进制转换成十进制,然后十进制转换成字符串,在这个转换的过程中发生了取近似值,所以打印出来的是一个近似值。
三、解决办法(重写计算方法)
/*
* 重写 加减乘除 运算法则 保留精度
* */
class MathTools {
// 加
floatAdd(arg1, arg2) {
var r1, r2, m;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (floatMultiply(arg1 , m) + floatMultiply(arg2 , m)) / m;
}
// 减
floatSub(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
// 动态控制精度长度
n = (r1 >= r2) ? r1 : r2;
return ((floatMultiply(arg1 , m) - floatMultiply(arg2 , m)) / m).toFixed(n);
}
// 乘
floatMultiply(arg1, arg2) {
if(arg1 == null || arg2 == null){
return null;
}
var n1,n2;
var r1, r2; // 小数位数
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
console.log(r1);
console.log(r2);
n1 = Number(arg1.toString().replace(".", ""));
n2 = Number(arg2.toString().replace(".", ""));
console.log(Math.pow(10, r1+r2));
console.log(n1*n2);
return n1 * n2 / Math.pow(10, r1+r2);
}
// 除
floatDivide(arg1, arg2) {
if(arg1 == null){
return null;
}
if(arg2 == null || arg2 == 0){
return null;
}
var n1,n2;
var r1, r2; // 小数位数
try {
r1 = arg1.toString().split(".")[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split(".")[1].length;
} catch (e) {
r2 = 0;
}
n1 = Number(arg1.toString().replace(".", ""));
n2 = Number(arg2.toString().replace(".", ""));
return (n1 / n2) * Math.pow(10, r2 - r1);
}
}