美文网首页Web前端之路让前端飞Web 前端开发
一个数字截取引发的精度问题(一)

一个数字截取引发的精度问题(一)

作者: 前端黑板报 | 来源:发表于2017-03-12 11:39 被阅读64次
Paste_Image.png

上周有一个“收银台”的业务需要重构,其中有一个需求:

收益计算的结果,取小数点后两位但不进行四舍五入,若不足则补0。

看到这个需求你应该会第一个想到:

numberObj.toFixed([digits])

因为这个方法基本可以满足这个需求。但是当看到以前同事的方法时,感觉这个方法并不能完全满足:

/**
* 截断小数点后几位
* @val 数值
* @pos 小数点后截断的位置
*/
cutOffDecimal(val, pos) {
    // 把数字转换成字符串
    val = val.toString()
    let len = val.length
    let index = val.indexOf('.')
    let subVal = val; // 这是什么鬼?
    if (index != -1) {
      subVal = val.substring(0, index + pos +  1)
    }
    // 利用 toFixed 防止小数位达不到其位数要求
    return Number(subVal).toFixed(pos)
}

代码意思很明显,检测是否含有小数点,若有则用小数点的位置 + 精确的小数位置 + 1,因为substring最后一个位置不包括在内所以加1,
最后用toFixed补全。

他没有直接用toFixed,说明此方法不能直接满足。我查了一下API说明果然有猫腻:

The number is rounded if necessary

意思是此方法在必要时进行四舍五入,一看这个肯定不能直接满足此需求,我感觉上面代码写的也有点啰嗦,改写如下:

export function NumberPrecision(number,prec = 0){

    if(typeof number != 'number' || Number.isNaN(number)){
        console.error('Must be a number but not a NaN');
        return;
    }

    return number.toFixed(prec + 1).slice(0,-1);
}

1.类型判断,非数字以及NaN的则报错;

2.toFixed我没有直接取到目标位置,而是取到目标位置的下一个位置,这样就避免了该方法的四舍五入对结果造成的影响,然后再用slice截取字符串。

关注公众号(前端黑板报),获得最新文章:

Paste_Image.png

加入微信群,实时交流:

Paste_Image.png

相关文章

  • 一个数字截取引发的精度问题(一)

    上周有一个“收银台”的业务需要重构,其中有一个需求: 收益计算的结果,取小数点后两位但不进行四舍五入,若不足则补0...

  • 一个数字截取引发的精度问题(二)

    上篇文章只是简单介绍了 toFixed 方法,抽时间把 Number 里的一些方法又看了一下,其中有个方法引起我的...

  • 一个数字截取引发的精度问题(三)

    上次总结的第四条: 当传入的参数小于数字的整数位时,返回指数形式表示的字符串。 在JavaScript中有一个专门...

  • 数字精度引发的血案

    在监听键盘弹出的方法keyboardWillShowNotification:这样写了 tableViewOffs...

  • JS 数据精度以及数字格式化

    在做一些电商、财务业务的时候常常会遇见JS的数据精度问题以及数字格式化问题 数据精度问题包括两个方面: 大整数精度...

  • 小问题整理

    1.iOS11数字精度问题 /*! @brief 修正浮点型精度丢失 @param str 传入接口取到的数据 @...

  • js数字精度丢失问题

    一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加1 0.1 + 0.2 != 0.3// true ...

  • js中的数字精度问题

    在做练习题的过程中,发现了 0.8-0.2 = 0.60000001的问题。后来查询相关资料 发现存在这个问题是因...

  • php高精度计算

    bcadd — 将两个高精度数字相加 bcdiv — 将两个高精度数字相除 bcmod — 求高精度数字余数 bc...

  • PHP算术及精度计算

    一、高精度算术运算符 bcadd 将两个高精度数字相加bccomp 比较两个高精度数字,返...

网友评论

    本文标题:一个数字截取引发的精度问题(一)

    本文链接:https://www.haomeiwen.com/subject/pfutnttx.html