/**
* 把Number四舍五入为指定小数位数的数字字符串(解决原toFixed四舍五入问题)
* @param {number} [len=0] 保留小数位数
* @param {boolean} [round=true] 是否四舍五入(默认进行四舍五入)
* @param {boolean} [padding=true] 有效数字不足预设小数位数时是否后补0(默认后补)如:_toFixed(1.1,3,true,true) = "1.100" ; _toFixed(1.1,3,true,false) = "1.1"
* @returns {string}
* @example _toFixed(1.335,2);
*/
function _toFixed(num, len, round, padding) {
num = Number(num);
if (len < 0) {
throw new RangeError("digits argument must be between 0 and 100");
}
let numStr = String(num), //数字转字符串
pointIndex = numStr.indexOf("."), //小数点下标
preNumIndex = pointIndex + len + 1; //保留位后一位数字下标
if (numStr.includes("e") || pointIndex === -1) {
//遇到科学表示法或整数,直接返回原生toFixed处理结果
return num.toFixed(len);
}
let addZeroCount = len - (numStr.length - pointIndex - 1); //需补0的个数
if (addZeroCount > 0) {
numStr += "0".repeat(addZeroCount); //小数位不足后补0
}
let numCut = Math.abs(numStr.substring(0, preNumIndex)); //截取保留位(含)前的所有字符
let res =
(num < 0 ? "-" : "") +
(round && numStr[preNumIndex] >= 5
? numCut + 1 / Math.pow(10, len)
: numCut
).toFixed(len); //判断预期小数位后一位是否大于等于5,是则进位
return padding ? res : String(Number(res));
}
console.log(_toFixed(123.456, 2, false, true), "是否四舍五入自我控制");