由于精度问题, 不能说两个超大数字相除...
计算机的二进制实现和位数限制有些数无法有限表示. 就像一些无理数不能有限表示, 如 圆周率 3.1415926...,1.3333... 等.
IEEE 754 https://en.wikipedia.org/wiki/IEEE_floating_point 规范
这里的代码, 被除数如果超过 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 是两个大数相加, 专栏里面有.
来源: https://www.qcloud.com/developer/article/1633764