两个数字相除
由于精度问题,不能说两个超大数字相除...
计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。
这里的代码,被除数如果超过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 方法在我博文里面有,这里就不贴了。
声明:严禁抄袭,欢迎转载!不过请带上博文链接!
或者你有更好的实现方式、或者你觉得有可以优化的地方,不妨评论讨论下!觉得得到帮助的可以点个推荐,让更多人也可以得到帮助。

浙公网安备 33010602011771号