源码
/**
* 四舍五入,保留指定小数位数,当原始数据不满足长度时,不要补 0
* @param number [Number | String] 原始数据,支持字符串和数值型
* @param i [Number] 保留的小数个数 >= 0
* @returns [Number] 转换后的数据
*/
function transformDecimal(number, i) {
let decimalNum = null;
// 先转换为数值型
let num = Number(number);
// 判断是否为数值型
if(!isNaN(num)) {
// 切分整数与小数
let arr = num.toString().split(".");
// 是小数且小数位大于保留个数
if(arr.length > 1 && arr[1].length > i) {
// 小数部分字符串
let decimal = arr[1].slice(i, i+1);
// toFixed 有 bug,四舍六入五随机
// 当四舍五入的数为 5,给其 + 1
if(decimal === '5') {
// 这里可能会存在 0.1 ** 5 = 0.000010000000000000003 但不影响四舍五入
num += Math.pow(0.1, i+1);
}
decimalNum = num.toFixed(i);
}
else {
decimalNum = num;
}
decimalNum = Number(decimalNum);
}
return decimalNum;
}
问题
toFixed 存在bug,四舍六入五随机
12.5.toFixed() // "13"
12.15.toFixed(1) // "12.2"
12.115.toFixed(2) // "12.12"
12.1115.toFixed(3) // "12.111" 没有五入
12.11115.toFixed(4) // "12.1112"
12.111115.toFixed(5) // "12.11111" 没有五入
12.1111115.toFixed(6) // "12.111111" 没有五入
测试
transformDecimal(12.4, 0) // 12
transformDecimal(12.5, 0) // 13
transformDecimal(12.6, 0) // 13
transformDecimal(12.14, 1) // 12.1
transformDecimal(12.15, 1) // 12.2
transformDecimal(12.16, 1) // 12.2
transformDecimal(12.114, 2) // 12.11
transformDecimal(12.115, 2) // 12.12
transformDecimal(12.116, 2) // 12.12
transformDecimal(12.1114, 3) // 12.111
transformDecimal(12.1115, 3) // 12.112
transformDecimal(12.1116, 3) // 12.112
transformDecimal(12.11114, 4) // 12.1111
transformDecimal(12.11115, 4) // 12.1112
transformDecimal(12.11116, 4) // 12.1112
transformDecimal(12.111114, 5) // 12.11111
transformDecimal(12.111115, 5) // 12.11112
transformDecimal(12.111116, 5) // 12.11112
transformDecimal(12.1111114, 6) // 12.111111
transformDecimal(12.1111115, 6) // 12.111112
transformDecimal(12.1111116, 6) // 12.111112
transformDecimal('12.255', 2) // 12.26
transformDecimal('a', 2) // null
transformDecimal(12.1501, 2) // 12.15
transformDecimal(12.1501, 3) // 12.15
transformDecimal(12.00, 2) // 12
transformDecimal(12.500, 2) // 12.5
transformDecimal(12.150, 3) // 12.15
transformDecimal(12.150, 1) // 12.2
transformDecimal(12.1501, 1) // 12.2