JavaScript 保留指定小数位数(四舍五入)

源码

/**
 * 四舍五入,保留指定小数位数,当原始数据不满足长度时,不要补 0
 * @param number [Number | String] 原始数据,支持字符串和数值型
 * @param i [Number] 保留的小数个数 >= 0
 * @returns [Number] 转换后的数据
 */
function transformDecimal(number, i) {
    let decimalNum = null;
    // 先转换为数值型
    let num = Number(number);
    // 判断是否为数值型
    if(!isNaN(num)) {
        // 切分整数与小数
        let arr = num.toString().split(".");
        // 是小数且小数位大于保留个数
        if(arr.length > 1 && arr[1].length > i) {            
            // 小数部分字符串
            let decimal = arr[1].slice(i, i+1);
            // toFixed 有 bug,四舍六入五随机
            // 当四舍五入的数为 5,给其 + 1
            if(decimal === '5') {
                // 这里可能会存在 0.1 ** 5 = 0.000010000000000000003 但不影响四舍五入
                num += Math.pow(0.1, i+1);
            }
            decimalNum = num.toFixed(i);        
        }
        else {
            decimalNum = num;
        }
        decimalNum = Number(decimalNum);
    }     
    return decimalNum;
}

问题

toFixed 存在bug,四舍六入五随机

12.5.toFixed() // "13"
12.15.toFixed(1) // "12.2"
12.115.toFixed(2) // "12.12"
12.1115.toFixed(3) // "12.111" 没有五入
12.11115.toFixed(4) // "12.1112"
12.111115.toFixed(5) // "12.11111" 没有五入
12.1111115.toFixed(6) // "12.111111" 没有五入

测试

transformDecimal(12.4, 0) // 12
transformDecimal(12.5, 0) // 13
transformDecimal(12.6, 0) // 13

transformDecimal(12.14, 1) // 12.1
transformDecimal(12.15, 1) // 12.2
transformDecimal(12.16, 1) // 12.2

transformDecimal(12.114, 2) // 12.11
transformDecimal(12.115, 2) // 12.12
transformDecimal(12.116, 2) // 12.12

transformDecimal(12.1114, 3) // 12.111
transformDecimal(12.1115, 3) // 12.112
transformDecimal(12.1116, 3) // 12.112

transformDecimal(12.11114, 4) // 12.1111
transformDecimal(12.11115, 4) // 12.1112
transformDecimal(12.11116, 4) // 12.1112

transformDecimal(12.111114, 5) // 12.11111
transformDecimal(12.111115, 5) // 12.11112
transformDecimal(12.111116, 5) // 12.11112

transformDecimal(12.1111114, 6) // 12.111111
transformDecimal(12.1111115, 6) // 12.111112
transformDecimal(12.1111116, 6) // 12.111112

transformDecimal('12.255', 2) // 12.26

transformDecimal('a', 2) // null

transformDecimal(12.1501, 2) // 12.15
transformDecimal(12.1501, 3) // 12.15

transformDecimal(12.00, 2)  // 12
transformDecimal(12.500, 2) // 12.5
transformDecimal(12.150, 3) // 12.15

transformDecimal(12.150, 1) // 12.2
transformDecimal(12.1501, 1) // 12.2

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值