由于精度问题,不能说两个超大数字相除...
计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。
IEEE 754 规范
这里的代码,被除数如果超过 16 位,除数大于 6 位,就会出现很明显的问题了。
即使达到上面两个条件,这里的浮点运算也不能做到很精准,四舍五入到个位数
function except(f, t) {
f += '';
let i, j, curr, mult, n, inte, decimalLen, zl, z,
len = f.length,
currIndex = 0,
arr = [],
zero = 0,
fArr = f.split('').reverse().join(''),
current,
result = [],
decimal = '',
decimalArr = [],
reg = new RegExp(/^(0+)/gi);
function addZero(n) {
z = '';
for (j = 0; j < n; j++) {
z += '0';
}
return z;
}
for (i = 0; i < len; i++) {
arr[i] = [fArr[i], addZero(i)]
}
for (i = 0; i < len; i++) {
current = arr[i];
n = current[0]
curr = n / t + '';
currIndex = curr.indexOf('.');
zero = current[1];
if (currIndex > -1) {
zl = zero.length;
inte = curr.slice(0, currIndex);
decimal = curr.slice(currIndex + 1);
decimalLen = decimal.length;
if (zl >= decimalLen) {
inte = inte === '0' ? '' : inte;
result[i] = inte + decimal + zero.slice(decimalLen);
} else {
curr = inte + decimal.slice(0, zl);
if (n * 1 < t) {
curr = curr.replace(reg, '');
}
result[i] = curr;
decimalArr.push((decimal + '0').slice(zl, zl + 2));
}
} else {
result[i] = curr + zero;
}
}
len = decimalArr.length;
current = 0;
for (i = 0; i < len; i++) {
current += decimalArr[i] * 1;
}
len = result.push(Math.round(current / 100) + '');
mult = result[0];
for (i = 1; i < len; i++) {
mult = largeCount(mult || '0', result[i] || '0');
}
return mult;
}
largeCount 是两个大数相加,专栏里面有。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。