/** * 把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), "是否四舍五入自我控制");
原文:https://www.cnblogs.com/qinyuanchun/p/13394339.html