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