JavaScript Number 处理方法总结

JavaScript 提供了多种处理数字的方法和属性,下面我将详细介绍常用的 Number 处理方法,包括 Number.isNaN()Number.parseInt() 等。

1. Number 构造函数方法

Number.isNaN()

判断一个值是否是 NaN(比全局的 isNaN() 更严格)。

console.log(Number.isNaN(NaN));      // true
console.log(Number.isNaN(0/0));     // true
console.log(Number.isNaN('NaN'));   // false (全局 isNaN() 会返回 true)
console.log(Number.isNaN(123));     // false

Number.isFinite()

判断一个值是否是有限的数字(比全局的 isFinite() 更严格)。

console.log(Number.isFinite(123));      // true
console.log(Number.isFinite(-1.23));    // true
console.log(Number.isFinite('123'));    // false (全局 isFinite() 会返回 true)
console.log(Number.isFinite(Infinity)); // false

Number.isInteger()

判断一个值是否是整数。

console.log(Number.isInteger(25));    // true
console.log(Number.isInteger(25.0));  // true
console.log(Number.isInteger(25.1));  // false
console.log(Number.isInteger('25'));  // false

Number.isSafeInteger()

判断一个值是否是安全整数(在 -(2^53 - 1) 到 2^53 - 1 范围内)。

console.log(Number.isSafeInteger(3));                    // true
console.log(Number.isSafeInteger(Math.pow(2, 53)));     // false
console.log(Number.isSafeInteger(Math.pow(2, 53) - 1)); // true

Number.parseInt() / Number.parseFloat()

与全局的 parseInt()parseFloat() 功能相同。

console.log(Number.parseInt('123.45'));    // 123
console.log(Number.parseFloat('123.45'));  // 123.45
console.log(Number.parseInt('101', 2));    // 5 (二进制解析)

2. Number 原型方法

toFixed()

将数字转换为字符串,保留指定小数位数。

const num = 123.456;
console.log(num.toFixed(2));  // "123.46" (四舍五入)
console.log(num.toFixed(0));  // "123"
console.log(num.toFixed(5));  // "123.45600"

toExponential()

将数字转换为指数计数法的字符串。

console.log(num.toExponential(2));  // "1.23e+2"
console.log(num.toExponential(4));  // "1.2346e+2"

toPrecision()

根据指定的有效数字位数格式化数字。

console.log(num.toPrecision(5));  // "123.46"
console.log(num.toPrecision(2));  // "1.2e+2"
console.log(num.toPrecision(7));  // "123.4560"

toString()

将数字转换为指定基数的字符串。

console.log((10).toString(2));   // "1010" (二进制)
console.log((255).toString(16)); // "ff" (十六进制)
console.log((10).toString());    // "10" (十进制)

3. 数字转换方法

全局 parseInt() / parseFloat()

将字符串转换为整数/浮点数。

console.log(parseInt('123'));      // 123
console.log(parseInt('123.45'));   // 123
console.log(parseInt('ff', 16));   // 255 (十六进制)
console.log(parseFloat('123.45')); // 123.45

一元加号 (+)

快速将字符串转换为数字。

console.log(+"123");    // 123
console.log(+"123.45"); // 123.45
console.log(+"abc");    // NaN

4. 数学运算相关

Math 对象常用方法

console.log(Math.abs(-5));       // 5 (绝对值)
console.log(Math.round(4.6));    // 5 (四舍五入)
console.log(Math.floor(4.9));    // 4 (向下取整)
console.log(Math.ceil(4.1));     // 5 (向上取整)
console.log(Math.max(1, 3, 2));  // 3
console.log(Math.min(1, 3, 2));  // 1
console.log(Math.random());      // 0到1之间的随机数
console.log(Math.pow(2, 3));     // 8 (2的3次方)
console.log(Math.sqrt(16));      // 4 (平方根)

指数运算符 (**)

console.log(2 ** 3);  // 8 (等同于 Math.pow(2, 3))

5. 数字常量属性

console.log(Number.MAX_VALUE);      // 最大正数 (~1.79e+308)
console.log(Number.MIN_VALUE);      // 最小正数 (~5e-324)
console.log(Number.MAX_SAFE_INTEGER); // 最大安全整数 (2^53 - 1)
console.log(Number.MIN_SAFE_INTEGER); // 最小安全整数 (-(2^53 - 1))
console.log(Number.POSITIVE_INFINITY); // +Infinity
console.log(Number.NEGATIVE_INFINITY); // -Infinity
console.log(Number.EPSILON);       // 表示1与大于1的最小浮点数之差 (~2.22e-16)

6. 综合示例

// 数字处理实用函数
function formatFinancialNumber(value) {
  // 1. 转换为数字
  const num = Number(value);
  
  // 2. 验证数字有效性
  if (!Number.isFinite(num)) {
    throw new Error('Invalid number');
  }
  
  // 3. 检查是否为安全整数
  const isSafe = Number.isSafeInteger(num);
  
  // 4. 根据数字大小选择合适的格式
  let formatted;
  if (Math.abs(num) >= 1_000_000) {
    formatted = num.toExponential(2);
  } else if (Math.abs(num) < 0.01 && num !== 0) {
    formatted = num.toExponential(4);
  } else {
    // 确定小数位数
    const decimalPlaces = num % 1 === 0 ? 0 : 
                         Math.min(4, (num.toString().split('.')[1] || '').length);
    formatted = num.toLocaleString(undefined, {
      minimumFractionDigits: decimalPlaces,
      maximumFractionDigits: decimalPlaces
    });
  }
  
  return {
    original: value,
    number: num,
    formatted,
    isSafeInteger: isSafe,
    isInteger: Number.isInteger(num),
    isPositive: num > 0
  };
}

// 测试用例
const testNumbers = [
  '1234567890',
  '0.000000123',
  '123.456789',
  'NaN',
  'Infinity',
  '-9876543.21'
];

testNumbers.forEach(value => {
  try {
    const result = formatFinancialNumber(value);
    console.log(result);
  } catch (error) {
    console.error(`Error processing "${value}": ${error.message}`);
  }
});

7. 数字验证最佳实践

  1. 验证数字有效性

    function isValidNumber(value) {
      return typeof value === 'number' && !Number.isNaN(value) && Number.isFinite(value);
    }

  2. 安全数字比较

    function numbersEqual(a, b, epsilon = Number.EPSILON) {
      return Math.abs(a - b) < epsilon;
    }
  3. 处理大数字

    const bigIntValue = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1);
    console.log(bigIntValue.toString()); // "9007199254740992"

这些方法可以组合使用来处理各种数字操作需求,如数据验证、格式化、转换等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值