这篇文章就是记录一下自己写的一个方法。
方法说明
该方法主要是对 toFixed
方法的一个改写,因为 toFixed
方法在实际使用的过程中是有 bug 的,具体可以参考 。
下面是方法的一些说明:
/** * 控制数字的小数位,以及是否四舍五入 * @param {number|string} num 数字或者能被转成数字的字符串 * @param {number|string} len 保留小数的长度(默认保留所有的小数位) * @param {boolean} roundFlag 是否四舍五入(默认不四舍五入) * @return {string} 返回值是一个字符串 */
下面是一些效果:
toAmountFixed(123.45646789) // 123.45646789toAmountFixed(123.45646789, 4) // 123.4564toAmountFixed(123.45646789, 4, true) // 123.4565
具体代码
/** * 控制数字的小数位,以及是否四舍五入 * @param {number|string} num 数字或者能被转成数字的字符串 * @param {number|string} len 保留小数的长度(默认保留所有的小数位) * @param {boolean} roundFlag 是否四舍五入(默认不四舍五入) * @return {string} 返回值是一个字符串 */function toAmountFixed(num, len, roundFlag) { // 类型判断以及默认值处理 if(isNaN(num)) throw new Error('第一个参数必须为数字'); // 如果没有值,给出一个默认值,用于告知保留所有的小数位 if(len === undefined) len = '98789'; if(isNaN(len)) throw new Error('第二个参数必须为数字'); if(roundFlag === undefined) roundFlag = false; if(typeof roundFlag !== 'boolean') throw new Error('第三个参数必须为布尔类型'); // 类型转换 var numStr = num.toString(); var lenStr = len.toString(); if(lenStr.indexOf('.') !== -1 || lenStr < 0 || lenStr > 20) { if(lenStr !== '98789') { throw new Error('第二个参数必须在 0 到 20 之间的整数'); } } // 定义最终的返回值 var resultNum = ''; // .123 转成 0.123 if(numStr.indexOf('.') === 0) { numStr = Number(numStr).toString(); } // 首先对小数位数进行处理 if(lenStr === '98789') { // 没有指定保留小数位的情况 numStr = numStr; } else { // 指定保留小数位的情况 var tmpArr = numStr.split('.'); if(tmpArr.length === 2) { // 存在小数的情况 if(+lenStr > tmpArr[1].length) { numStr = addZero(numStr, +lenStr - tmpArr[1].length); } else { var oneMoreNum = '0'; // 保留小数位的后一位小数,用于确定四舍五入 oneMoreNum = tmpArr[1].substr(lenStr, 1); tmpArr[1] = tmpArr[1].substr(0, lenStr); numStr = tmpArr.join('.'); // 其次对四舍五入进行操作 if(roundFlag && +oneMoreNum >= 5) { numStr = ((Number(numStr) * Math.pow(10, +lenStr) + 1) / Math.pow(10, +lenStr)).toString(); } } } else { // 不存在小数的情况 numStr = addZero(numStr, lenStr); } } resultNum = numStr; return resultNum; // 对小数位之后追加 0 function addZero(srcNum, zeroNum) { var tmpZeroNum = ''; for(var i = 0; i < zeroNum; i++) { tmpZeroNum += '0'; } if(srcNum.indexOf('.') > -1) { return srcNum + tmpZeroNum; } else { return srcNum + '.' + tmpZeroNum; } }}