ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

js 金额计算异常解决方法

2022-09-02 09:04:48  阅读:181  来源: 互联网

标签:const 金额 Number js return length export multiple 异常


日常开发中,常规计算快捷展示,一般针对金额计算。例如购物车、批量操作数据展示总金额等等,一般都是前端负责处理,并且性能交互效果好,但是会衍生一个很大的问题。小学水平的计算,js居然计算出这么大的问题,难道是读书不听课???这里涉及一个问题,js的计算精度。计算机的数据底层是0和1,二进制的,而我们常用是10进制。由于有一些浮点数用二进制表示时是无穷的,当浮点数转化为二进制进行存储时,会把超过53位之后的进行合并导致精读丢失。关键字眼,部分浮点数,那么我们将数据分为两类,存在浮点和不存在浮点,不存在的话直接换算,其他的有一位小数,我们直接*10,那不就是整数了!!!看!代码!!!
// 计算补充0数量
export const getZero = (a, b) => {
    let zero = '',
        len = 0;
    if (a > b) {
        len = a - b;
    } else {
        len = b - a;
    }
    for (let i = 0; i < len; i++) {
        zero += '0';
    }
    return zero;
};

// 浮点数转换整数
export const decimalToInteger = (a, b) => {
    let _a = a.toString(),
        _b = b.toString();
    // 不存在小数 
    if (!_a.match(/\./g) && !_b.match(/\./g)) {
        return {
            _a,
            _b,
            multiple: 1
        };
    // 为浮点数
    } else {
        const al = _a.match(/\./g) ? _a.split('.')[1] : '',
            bl = _b.match(/\./g) ? _b.split('.')[1] : '',
            max = Math.max(al.length, bl.length),
            // 核心一:将原数据扩大到原来的10的n(小数位数)次方。也就是整数的效果
            multiple = Math.pow(10, max);
        _b = _b.replace(/\./g, '');
        _a = _a.replace(/\./g, '');
        if (al.length > bl.length) {
            _b += getZero(al.length, bl.length);
        } else {
            _a += getZero(al.length, bl.length);
        }
        return {
            _a,
            _b,
            multiple
        };
    }
};

// 加
export const add = (a, b) => {
    const {
        _a,
        _b,
        multiple
    } = decimalToInteger(a, b);
    // 核心二:将数据缩小回原效果。
    return (Number(_a) + Number(_b)) / multiple;
};

同理,其他四则运算:

// 减
export const subtract = (a, b) => {
    const {
        _a,
        _b,
        multiple
    } = decimalToInteger(a, b);
    return (Number(_a) - Number(_b)) / multiple;
};

// 乘
export const multiply = (a, b) => {
    const {
        _a,
        _b,
        multiple
    } = decimalToInteger(a, b);
    return (Number(_a) * Number(_b)) / Math.pow(multiple, 2);
};

// 除以
export const divide = (a, b) => {
    const {
        _a,
        _b,
        multiple
    } = decimalToInteger(a, b);
    return (Number(_a) / Number(_b));
};

不考虑内存大小和有更多计算要求的话,请使用更全面的math.js。

标签:const,金额,Number,js,return,length,export,multiple,异常
来源: https://www.cnblogs.com/ljt-8961/p/16647483.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有