zoukankan      html  css  js  c++  java
  • JavaScript 基本类型值-Number类型

    ▓▓▓▓▓▓ 大致介绍

      在JavaScript的内部采用IEEE754格式来表示数字,所以不区分整数和浮点数,都是用64位浮点数的形式储存。就是说,在JavaScript内部,就根本没有小数。但是有些运算必须得需要整数完成,所以JavaScript有时会把64位的浮点数转换成32位的整数,再进行运算。

    ▓▓▓▓▓▓ 整数

      JavaScript对整数提供四种表示方法:

        1、二进制:有前缀0b的数值,出现0,1以外的数字会报错

        2、八进制:有前缀0o的数值,或者是以0后面再跟一个数字(0-7)。如果超出了前面所述的数值范围,则会忽略第一个数字0,视为十进制数

          注意:八进制字面量在严格模式下是无效的,会导致支持该模式的JavaScript引擎抛出错误

        3、十六进制:有前缀0x,后跟任何十六进制数字(0~9及A~F),字母大小写都可以,超出范围会报错

        4、十进制

            var num2 = 0b11;
            console.log(num2); //3
            var num2 = 0b12;
            console.log(num2); //报错
    
            var num8 = 0o76;
            console.log(num8); //02
            var num8 = 0o78;
            console.log(num8); //报错
    
            var num16 = 0x2a;
            console.log(num16); //42
            var num16 = 0x2h;
            console.log(num16) //报错

    ▓▓▓▓▓▓ 浮点数

      所谓浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。与整数不同,浮点数只能用十进制来表示

      浮点数的精度远远不如整数,所以设计浮点数的运算好比较要小心

      例如:

            console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
            console.log(0.6/0.2); //2.9999999999999996

    ▓▓▓▓▓▓ 科学计数法

      对于那些极大极小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。用e表示法表示的数值等于e前面的数值乘以10的指数次幂

      以下两种情况,JavaScript会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。

        1、小数点前的数字多余21位

            console.log(1234567890123456789012);// 1.2345678901234568e+21
    
            console.log(123456789012365648787); //123456789012365660000

      

        2、小数点后面的0多余5位

            console.log(0.0000006);//6e-7
    
            console.log(0.000006); //0.000006

    ▓▓▓▓▓▓ 数值范围

      由于内存的限制,ECMAScript并不能保存世界上所有的数值,所以就有了最大值和最小值

      最小值保存在Number.MIN_VALUE中,这个值是5e-324

      最大值保存在Number.MAX_VALUE,这个值是1.7976931348623157e+308

            console.log(Number.MIN_VALUE) //5e-324
            console.log(Number.MAX_VALUE); //1.7976931348623157e+308

      如果数字超过最大值,javascript会返回Infinity,这称为正向溢出(overflow);如果等于或超过最小负值-1023(即非常接近0),javascript会直接把这个数转为0,这称为负向溢出(underflow)

      如果要想确定一个数值是不是有穷的,可以使用isFinite()函数。这个函数在参数位于最小与最大数值之间时会返回true

            var result = Number.MAX_VALUE + Number.MAX_VALUE;
            console.log(isFinite(result)); //false

    ▓▓▓▓▓▓ 特殊数值

      1、+0和-0

        这两个0在大对数的情况下都是等价的

            -0 === +0; //true
            0  === -0; //true
            0 === +0; //true

      

      但是在作为分母的时候是不一样的

            1/-0 == 1/+0; //false

      2、infinity

        Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。

            Math.pow(2,Math.pow(2,100));//Infinity
            1/0;//Infinity

      Infinity参与的运算结果只能是其本身、0或NaN

        2 * Infinity;//Infinity
        2 - Infinity;//-Infinity
        2 + Infinity;//Infinity
        2 / Infinity;//0
        Infinity / 2;//Infinity
        Infinity * Infinity;//Infinity
        Infinity - Infinity;//NaN
        Infinity + Infinity;//Infinity
        Infinity / Infinity;//NaN                

      3、NaN

      这个数值表示一个本来要返回数值的操作数未返回数值的情况

      NaN与任何值不相等,包括它本身,并且涉及NaN的任何操作都会返回NaN

            5 - 'x'; //NaN
            Math.acos(2); //NaN
            0 / 0; //NaN
            NaN == NaN;//false
            NaN == Infinity;//false    

      

      NaN不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于Number

            typeof NaN; //number

      isNaN方法可以用来判断一个值是否为NaN,但是,isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaNtrue的值,有可能不是NaN,而是一个字符串。

            isNaN('Hello') // true
            // 相当于
            isNaN(Number('Hello')) // true    

      判断NaN更可靠的方法是,利用NaN是javascript之中唯一不等于自身的值这个特点,进行判断

            function isNaN(value){
                return value != value;
            }

    ▓▓▓▓▓▓ 数制转换

      有3个函数可以把非数值转换成数值:Number()、parseInt()和parseFloat()。其中Number()可以将任意类型的值转化成数值,而parseInt()和parseFloat()只应用于字符串向数字的转换

      Number()

      转换规则:

        1、如果是Boolean值,true和false将分别转换为1和0

        2、如果是null值,返回0

        3、如果是undefined,返回NaN

        4、如果是字符串,遵循以下规则:

          (1)若字符串只包含十进制或十六进制数字,则转成十进制的数字

            注意:Number()不识别八进制数字的字符串,会按照十进制数字处理

               字符串'1.2.'不会报错,但数字1.2.会报错

          (2)若字符串为空字符串或空格字符串,则转成0

          (3)其他情况的字符串,则转成NaN

            Number(true) //1
            Number(null) //0
            Number(undefined) //NaN
            Number("0123") //123
            Number("0x123") //291
            Number("0.2") //0.2
            Number("") //0
            Number("asd") //NaN
            

      parseInt()

      parseInt()专门用于把字符串转换成整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符

            console.log(parseInt('    123.8px'));//123
            console.log(parseInt('   123.8   '));//123
            console.log(parseInt(' -123.8px'));//-123
            console.log(parseInt('a123.8px'));//NaN
            console.log(parseInt('0 123.8px'));//0

      注意:在ECMAScript5中,parseInt()已经不具备解析八进制的能力。例如八进制“070”,会忽略前面的“0”,得到十进制的70

      为了消除在使用parseInt()函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(多少进制)

            parseInt("070") //70
            parseInt("070",8) //56

      parseFloat()

      parseFloat()专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止

            console.log(parseFloat('    0123.px'));//123
            console.log(parseFloat('    123.px'));//123
            console.log(parseFloat('    123.1px'));//123.1
            console.log(parseFloat('   123.1.2px   '));//123.1
            console.log(parseFloat(' -123.0px'));//-123
            console.log(parseFloat('.123.1px'));//0.123
            console.log(parseFloat('0 123px'));//0

      注意:parseFloat()只解析十进制,所以十六进制的字符串始终会被转换成0。因此也没有第二个参数用来指定基数

            parseFloat("0xA") //0

      注意:Number('')的结果是0,parseInt('')和parseFloat('')的结果是NaN

    参考资料:

       阮一峰Javascript标准参考教程——基本语法之数值

       小火柴javascript类型系统——Number数字类型

      《javascript高级程序设计(第3版)》第3章 

  • 相关阅读:
    SpringBoot国际化和国际化失败的原因
    java之上传文件、下载文件
    java之拦截器Interceptor/自定义视图解析器
    idea配置tomcat,idea和tomcat版本不一致输出json会报500错误,解决localhost:8080 is already in use问题,解决idea控制台日志乱码
    guzzle json 请求
    Testlib-Generator使用笔记
    Harbour.Space Scholarship Contest 2021-2022 (Div. 1 + Div. 2) 题解 (ABCDEF)
    Codeforces Round #731 (Div. 3) 题解 (DEFG)
    面试题
    yaml部署
  • 原文地址:https://www.cnblogs.com/qqandfqr/p/6435626.html
Copyright © 2011-2022 走看看