小数位四舍五入

通过数值计算的方式实现 toFixed ,小数位多了很容易出现精度问题

或者可以通过字符串的方式逐位判断稳妥些(当然,后端直接给的精度更省事)

toFixed(num: string, dec: number) {
        if (dec === 0) {
            return Number(num).toFixed(0);
        }
        let res = num;
        let point = res.match(/\./);
        if (point) {
            // 有小数点,获取小数点下标
            // @ts-ignore
            let end = point.index + 1 + Number(dec)
            let sub = end;
            let temp = res.substr(0, end);
            if (temp === res) {
                // 说明小数位数不够,则无需四舍五入
            } else {
                // 记录当前位是否需要进1
                let add = 0;
                while (sub > -1) {
                    if (sub === end) {
                        // 判断舍弃位是否需要进1
                        if (Number(res[sub]) > 4) {
                            add = 1;
                        } else {
                            // 小于五不用进1
                        }
                        res = temp;
                    } else if (res[sub] !== '.') {
                        // 开始处理值,当前位是否需要加1以及前一位是否需要进1
                        let current = 0;
                        if (add === 1 && Number(temp[sub]) === 9) {
                            // 当前位加1后值
                            current = 0;
                            // 需向前进1标记
                            add = 1;
                        } else {
                            // 计算当前位的值
                            current = (Number(temp[sub]) + add);
                            // 无需进1,重置
                            add = 0;
                        }
                        // 对应下标数字替换
                        let arr = res.split('');
                        arr[sub] = current + '';
                        // @ts-ignore
                        res = arr.join().replaceAll(',', '');
                    }
                    sub--;
                }
            }
        }
        return res;
    }

 

posted @ 2024-02-02 14:30  名字不好起啊  阅读(10)  评论(0编辑  收藏  举报