首先计算机计算是要先转化为二进制进行计算。
十进制数转化为二进制
整数是逐步除2取余数 直到除不尽为止。倒取余数
小数是乘2取整,顺序排列 直到积中的小数部分为零,或者达到所要求的精度为止
浮点数后面无限循环(例如0.1转换成二进制的这种)造成浏览器进行计算的时候显示不精确
解决办法
1、提前知道小数点的位数的 先放大倍数到整数然后进行计算 在除以放大倍数
0.1 + 0.2 // 0.30000000000000004
(0.1*10 + 0.2*10) / 10 // 0.3
0.1 + 0.02 // 0.12000000000000001
(0.1*100 + 0.02*100) / 100 // 0.12
2、方法整合
加法
function add(arg1, arg2){
let r1, r2, m, c // r1 r2分别存储两个计算数组的小数位数 c表示相差的位数 m表示需要扩大的倍数
try {
r1 = arg1.toString().split('.')[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg2.toString().split('.')[1].length
} catch (e) {
r2 = 0
}
c = Math.abs(r1-r2) // 大于0表示小数的位数不一致 等于0表述小数位数一致
m = Math.pow(10, Math.max(r1, r2))
if(c>0){
let cm = Math.pow(10, c)
if(arg1 > arg2){
arg1 = Number(arg1.toString().replace('.', ''))
arg2 = Number(arg2.toString().replace('.', ''))*cm
} else {
arg1 = Number(arg1.toString().replace('.', ''))*cm
arg2 = Number(arg2.toString().replace('.', ''))
}
} else {
arg1 = Number(arg1.toString().replace('.', ''))
arg2 = Number(arg2.toString().replace('.', ''))
}
return (arg1+arg2)/m
}
减法
function sub(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 ((arg1 * m - arg2 * m) / m).toFixed(n);
}
乘法
function mul(arg1, arg2) {
var m = 0, // 两个相乘数字的小数位数的和
s1 = arg1.toString(),
s2 = arg2.toString();
try {
m += s1.split(".")[1].length;
} catch (e) {}
try {
m += s2.split(".")[1].length;
} catch (e) {}
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
除法
function div(arg1, arg2) {
var t1 = 0,
t2 = 0,
r1, r2; // r1 r2 分别表示两个相除的值扩大为整数后的值
try {
t1 = arg1.toString().split(".")[1].length;
} catch (e) {}
try {
t2 = arg2.toString().split(".")[1].length;
} catch (e) {}
r1 = Number(arg1.toString().replace(".", ""));
r2 = Number(arg2.toString().replace(".", ""));
return (r1 / r2) * Math.pow(10, t2 - t1);
}