美文网首页
数值运算:i++,++i 和上下取整

数值运算:i++,++i 和上下取整

作者: 辛辣之火可以燎原 | 来源:发表于2018-02-02 21:15 被阅读97次

    本节练习
    搜索查询num++(后面自加)和++num(前面自加)的区别,并进行总结。
    搜索查询如何利用Math方法对得到的结果进行保留两位小数,四舍五入,向上取整,向下取整等操作,并进行总结。

    一、num++ 与 ++ num 的区别;

    var num = 1;
    num++;// num is 2
    ++num;// num is 3
    var base = 0;
    base = ++num + base;
    // base is  4, not 3, num is 4,equals: base = num + 1 + base
    base = base + num++ ;
    // base is 8, not 9, num is 5, equals: base = base + num;num= num + 1;
    

    总结:单独使使用 num++ 与 ++num,都是让变量自增1,没有什么区别。但是当二式子位于其他语句中时,num++是先用num原值带入计算,语句执行完后,num自增1,而 ++num 是先让变量值自增1之后,使用增加后的值带入语句运算。窃以为,实际开发中,为避免脑子抽搐出现错误,横生枝节,当式子比较长时,多用括号表示,弃用 num++,++num 为宜。

    二、控制有效小数位数

    • 向上取整:Math.ceil() 函数返回大于或等于一个给定数字的最小整数。
    • 向下取整:Math.floor() 返回小于或等于一个给定数字的最大整数。
    • 四舍五入:Math.round() 函数返回一个数字四舍五入后最接近的整数值。
    • 保留两位小数:
      Math.round(num * 100) / 100;numb = numb.toFixed(2); 对于某些用例无法计算出正确的结果。
      前者如:
      Math.round(1.005 * 1000)/1000 // Returns 1 instead of expected 1.01!
      后者如:
    parseFloat("1.555").toFixed(2); // Returns 1.55 instead of 1.56.
    parseFloat("1.5550").toFixed(2); // Returns 1.55 instead of 1.56.
    // However, it will return correct result if you round 1.5551.
    parseFloat("1.5551").toFixed(2); // Returns 1.56 as expected.
    1.3555.toFixed(3) // Returns 1.355 instead of expected 1.356.
    // However, it will return correct result if you round 1.35551.
    1.35551.toFixed(2); // Returns 1.36 as expected.
    

    摘抄一个不知其所以然的正确算法。

    function roundNumber(num, scale) {
      if(!("" + num).includes("e")) {
        return +(Math.round(num + "e+" + scale)  + "e-" + scale);
      } else {
        var arr = ("" + num).split("e");
        var sig = ""
        if(+arr[1] + scale > 0) {
          sig = "+";
        }
        return +(Math.round(+arr[0] + "e" + sig + (+arr[1] + scale)) + "e-" + scale);
      }
    }
    

    囿于上述算法过于复杂,大部分情况还是用Math.round(num * 100) / 100;numb = numb.toFixed(2);来得省事。正如一位网友说,过分精确的计算还是直接用后台传吧,前端就别用 js 折腾了。

    参考资料
    MDN:Math 对象
    StackOverflow:保留两位小数_roundingAlgo
    StackOverflow:保留两位小数b

    相关文章

      网友评论

          本文标题:数值运算:i++,++i 和上下取整

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