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

本节练习
搜索查询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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容