前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >两个数字相除

两个数字相除

原创
作者头像
wuxiexy
修改2020-05-28 15:19:22
2.1K1
修改2020-05-28 15:19:22
举报

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

计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。

IEEE 754 规范

这里的代码,被除数如果超过 16 位,除数大于 6 位,就会出现很明显的问题了。

即使达到上面两个条件,这里的浮点运算也不能做到很精准,四舍五入到个位数

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档