控制小数位数

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;
    }
  }
}

以上是关于控制小数位数的主要内容,如果未能解决你的问题,请参考以下文章

java编程中怎么控制小数点后的位数?

matlab 设置小数点后位数

Python:format函数控制输出的小数点位数

java中如何控制输出数字位数

C语言中输出时怎样控制小数点后的位数,请举例说明保留1、2、3、4位小数等等,谢谢

C语言中输出时怎样控制小数点后的位数,请举例说明保留1、2、3、4位小数等等,谢谢