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