一、方法
function toFixed(number, n) {
let numberStr = number + "";
let reg = /^(-|\+)?(\d+(\.\d*)?|\.\d+)$/i;
if (!reg.test(numberStr)) {
console.error('输入的数字格式不对');
return;
}
let sign = numberStr.charAt(0) === '-' ? (numberStr = numberStr.slice(1), -1) : 1; // 判断是否是负数
let pointIndex = numberStr.indexOf("."); // 记录小数点的位置
if (pointIndex > -1) {
numberStr = numberStr.replace(".", "");
} else { // 没有小数点直接添加补0;
numberStr += ".";
numberStr += new Array(n).join('0');
return numberStr;
}
let numberArray = numberStr.split(""); //转成数组
let len = numberArray.length;
let oldPointNum = len - pointIndex; // 获取原数据有多少位小数
if (oldPointNum < n) { // 要保留的小数点比原来的要大,直接补0
while (n - oldPointNum > 0) {
numberArray.push(0);
n--;
}
} else if (oldPointNum > n) { // 模拟四舍五入
let i = oldPointNum - n; // 从倒数第i个数字开始比较
let more = numberArray[len - i] >= 5 ? true : false;
while (more) {
i++;
more = +numberArray[len - i] + 1 === 10 ? true : false; // 进位后判断是否等于10,是则继续进位
numberArray[len - i] = more && i !== (len + 1) ? 0 : +numberArray[len - i] + 1; // 其他位置的数字进位直接变成0,第一位的例外
}
numberArray.length = len - (oldPointNum - n); // 截取多余的小数
}
numberArray.splice(pointIndex, 0, ".");
return sign === -1 ? '-' + numberArray.join("") : numberArray.join("");
}
二、使用
alert(toFixed(0.356, 2)); // 0.36
alert(toFixed(-5.86578, 1)); // -5.9
alert(toFixed(500, 2)); // 500.0