嫌长不看版:
//输入num数值和要保留n位小数,返回四舍五入的值
function round(num, n) {
return Math.round(num * Math.pow(10, n)) / Math.pow(10, n);
}
前端在计算订单数据的时候发现用toFixed好像并不准确:
toFixed(n)
代表保留n位小数,会自动进行位数保留,一直以为是按照四舍五入进行计算,实践后并查阅资料和得知并不是,他按照的是银行家舍入法。
默认按照四舍六入五取偶。具体为:
四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一
看例子:
// 5前是小数点时按四舍五入
1.5.toFixed(0) // 2
2.5.toFixed(0) // 3
// 此时就 五前为偶应舍去,五前为奇要进一
1.55.toFixed(1) // 1.6
1.65.toFixed(1) // 1.6
1.75.toFixed(1) // 1.8
Math.round()
默认四舍五入取整
Math.round(1.50) // 2
Math.round(1.49) // 1
向上取整
Math.ceil(1.2) // 2
向下取整
Math.floor(1.2) // 1
所以正确的标准的四舍五入函数不能再使用toFixed了
//输入num数值和要保留n位小数,返回四舍五入的值
function round(num, n) {
return Math.round(num * Math.pow(10, n)) / Math.pow(10, n);
}
综上,如果是百分比,那么四舍五入的转换的做法为:
var percent = 0.5678;
var percentString = round(percent*100, 2) + '%'; //得到56.78%
就是先运算,最后去保留小数。不能先保留小数再*100