toFixed —— 将数值四舍五入为指定小数位数的数字

一、方法

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
posted @ 2021-01-22 10:00  徐林俊  阅读(192)  评论(0编辑  收藏  举报