两个数字相除

由于精度问题,不能说两个超大数字相除...

计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 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.slice(++zl, zl + 4));
            }

        } else {
            result[i] = curr + zero;
        }
    }

    len = decimalArr.length;
    current = 0;
    for (i = 0; i < len; i++) {
        current += decimalArr[i] * 1;
    }
    result.push(Math.round(current / 10000) + '');

    len = result.length;
    mult = result[0];
    for (i = 1; i < len; i++) {
        mult = largeCount(mult || '0', result[i] || '0');
    }
    return mult;
}

largeCount 方法在我博文里面有,这里就不贴了。

声明:严禁抄袭,欢迎转载!不过请带上博文链接!

或者你有更好的实现方式、或者你觉得有可以优化的地方,不妨评论讨论下!觉得得到帮助的可以点个推荐,让更多人也可以得到帮助。

猜你喜欢

转载自www.cnblogs.com/wuxiexy/p/12970448.html