详说Number()

1,961 阅读3分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

简单了解Number()


与其他语言不同JS是不区分整数值和浮点值的。Number类型使用的是IEEE754格式表示整数和浮点值的。Number的整数范围大概在-2的53次幂到2的53次幂。

如果要确定一个值是否超过JS能表示的范围,可以使用isFinite()函数。

    let result = Number.MAX_VALUE + Number.MAX_VALUE;
    console.info(isFinite(result)); // false;
    // ECMAScript 表示最小数值保存在  Number.MIN_VALUE,最大数值保存在 Number.MAX_VALUE

注:+0与-0是相等的

不同数值有不同数值字面量格式


  • 十进制基本数值字面量: let num = 23;

  • 十六进制,以0x开头,数值十六进制数字(0 ~ 9,a ~ f,A ~ F): let num = 0x1f; // 31

  • 八进制,以0开头,数值为相应八进制(0 ~ 7): let num = 070; // 56,如果超出范围就会忽略前面的0转换为十进制数(八进制在严格模式下是无效的)

定义浮点值


浮点值必须包括小数点,小数点后面必须有数字,前面不是必须非要加上数字但是建议加上。

当小数点后面没有值或者是0的时候数值就会变成整数。这是因为存储浮点值占用的内存空间是存储整数值空间的两倍。

    let num1 = 1.; // 1
    let num2 = 10.0; // 10
  • 很大的浮点数怎么办

    其实也是可以和数学一样用科学计数法 let nums = 3.14e6;相当于3140000

  • 那很小的数也是一样的哦

    let nums = 2e-7; 相当于 0.0000002

浮点值的精确度高达小数点后面17位,这也就出现了经典的精度丢失问题 0.1 + 0.2 !== 0.3;

js在做数字计算时,底层都是转二进制来计算的,0.1与0.2转二进制都是无线循环小数,js采用二进制浮点运算,小数点后只保留53位小数,导致精度丢失。

如何解决精度丢失的问题:

1、将小数扩大成整数做完加法后再变回去(有可能超过js的最大数)。

2、利用第三方库,比如Math.js、big.js等;

一个特殊的数值NaN


意思为Not a Number 不是一个数值

  • 那些会产生NaN的计算
    console.info(0/0); // NaN
    console.info(-0/+0); // NaN
    console.info(Number(undefined)); //NaN
    console.info(Number('jxx')); //NaN

任何涉及NaN的操作都会返回NaN(如NaN/2),但是判断是否相等除外

    console.info(NaN == NaN); // false

正因为如此ES为我们提供了isNaN()函数来判断是不是NaN

    console.info(isNaN(NaN)); // true
    console.info(isNaN(100)); // false 100 是数值
    console.info(isNaN("100")); // false 可以转换为数值100
    console.info(isNaN("blue")); // true 不可以转换为数值
    console.info(isNaN(true)); // false 可以转换为数值1

注: isNaN()也是可以用于测试对象的。是ES内置函数和操作符的工作方式首先调用对象的valueOf()方法,确定返回值是否可以转为数值,如果不能则调用toString()方法测试它的返回值。

剩下就是简单的数值转换,也是我们都众所周知的

    let num1 = Number('hh'); // NaN
    let num2 = Number(''); // 0
    let num3 = Number(0); // 0
    let num4 = Number('0009'); // 9
    let num5 = Number(true); // 1 false为0
    let num6 = Number('0xf'); // 15