控制小数位数
Posted negivup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制小数位数相关的知识,希望对你有一定的参考价值。
这篇文章就是记录一下自己写的一个方法。
方法说明
该方法主要是对 toFixed
方法的一个改写,因为 toFixed
方法在实际使用的过程中是有 bug 的,具体可以参考 JS中浮点数精度问题。
下面是方法的一些说明:
/**
* 控制数字的小数位,以及是否四舍五入
* @param {number|string} num 数字或者能被转成数字的字符串
* @param {number|string} len 保留小数的长度(默认保留所有的小数位)
* @param {boolean} roundFlag 是否四舍五入(默认不四舍五入)
* @return {string} 返回值是一个字符串
*/
下面是一些效果:
toAmountFixed(123.45646789) // 123.45646789
toAmountFixed(123.45646789, 4) // 123.4564
toAmountFixed(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;
}
}
}
以上是关于控制小数位数的主要内容,如果未能解决你的问题,请参考以下文章