zoukankan      html  css  js  c++  java
  • JS魔法堂:再识Number type

    Brief                                

      本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。以下是恶补后的成果:

      基础野:细说原码、反码和补码(http://www.cnblogs.com/fsjohnhuang/p/5060242.html)

      基础野:细说无符号整数(http://www.cnblogs.com/fsjohnhuang/p/5078290.html)

      基础野:细说有符号整数(http://www.cnblogs.com/fsjohnhuang/p/5082829.html)

      基础野:细说浮点数(http://www.cnblogs.com/fsjohnhuang/p/5109766.html)

      理解JS Number type背后的IEEE 754 64位双精度数值编码后,0.1 + 0.2 == 0.30000000000000004就不言而喻了,但单纯的理解了现象的本质是不够,我们需要的是如何解决这类问题,不然下次遇到同类问题我们只能同样的无力而已:(

      但在寻求或自己手写工具库前,我觉得还是先了解JS为我们提供的原生API比较明智。

    APIs                                

      Numeric literal

        ES5 APIs

          OctalLiteral,八进制数值字面量,数值域以0开始且不含小数点。如:012转换为十进制数值为10 。

                            注意:在strict mode中OctalLiteral是非法的。

          DecimalLiteral,十进制数值字面量,数值域以1-9或.或0.开始。

                                还有含指数和不含指数两种字面量形式

                 含指数形式:1.1e2表示110

                     e或E表示指数提示符,后面紧跟则指数值Exp;

                                                Exp必须为正/负整数或零;

                     基数固定为10 。

          HexLiteral,十六进制数值字面量,数值域以0x或0X开始。如:0x0F转换为十进制数值为15 。

       ES6 APIs

      BinaryLiteral, 二进制数值字面量,数值域以0b或0B开始。如:0b0100转换为十进制数值为4 。

      OctalLiteral,八进制数值字面量,数值域以0o或0O开始。如:0o12转换为十进制数值为10 。

      Number Function

          当以Number([value])的方式调用时,返回值为Number value。

      Number Constructor

      当以new Number([value])的方式调用时,返回值为Number object。

      Function Properties

      ES5 APIs

        Number.MIN_VALUE,可表示的最接近0的值。(2^53-1)*2^-1074 即约等于1.7976931348623157 × 10^308。

        Number.MAX_VALUE,可表示的最大值。  (2^53-1)*2^971即约等于5 × 10^−324。

        Number.NaN,返回Number type的Not-a-Number值。

        Number.NEGATIVE_INFINITY,返回-Infinity。

        Number.POSITIVE_INFINITY,返回Infinity。

        window.isFinite([value]),判断value值是否为有限数。会先将value转换为Number value后再判断。

        window.isNaN([value]),判断value值是否为Not-a-Number。会先将value转换为Number value后再判断。

        window.parseInt([value], [radix=10]),以radix作为进制将value转换为十进制整数。

        window.parseFloat([value]),将value转换为实数。

      ES6 APIs

        Number.MIN_SAFE_INTEGER,可精确表示的整数范围下限。-Math.pow(2, 53)+1,即是-9007199254740991。

        Number.MAX_SAFE_INTEGER,可精确表示的整数范围上限。Math.pow(2, 53)-1,即是9007199254740991。

        Number.EPSILON,极小值(2.220446049250313e-16),作为允许的误差范围使用。

                  (当某运算结果的误差小于Number.EPSILON则认为该结果是可被接受的)

                  判断是否可接受的函数:

    function withinErrorMargin (left, right) {
      return Math.abs(left - right) < Number.EPSILON
    }

        Number.isFinite([value]),判断value值是否为有限数。若value不为Number type则直接返回false。

        Number.isNaN([value]),判断value值是否为Not-a-Number。若value不为Number type则直接返回false。

        Number.parseInt([value], [radix=10]),以radix作为进制将value转换为十进制整数。

        Number.parseFloat([value]),将value转换为实数。

        Number.isInteger([value]),value为number类型,且小数部分全为0则返回true。(Number.isInteger(2.0)返回true)

        Number.isSaveInteger([value]),value为number类型,且Number.MIN_SAFE_INTEGER <= value <= Number.MAX_SAFE_INTEGER则返回true。

      Number.prototype Properties

      ES5 APIs

        Number.prototype.toString([radix=10]):DOMString,返回以radix作为进制输出数值字符串,radix为2~36。

          注意:对于负数而言,当radix为2时返回的是不补码编码的位模式,而是形如 -10100.0101011 的 "负号" + "原码位模式" 的形式。

        Number.prototype.valueOf():Number value,返回Number object的[[PrimitiveValue]]值。

        Number.prototype.toFixed([fractionDigits=0]):DOMString,返回指定小数位的十进制定点数字符串。

          注意:1.fractionDigits必须大于等于0和小于等于20,否则会抛RangeError;

               2.若数值大于e21则直接返回Number.prototype.toString()的值;

             3.若数值小于e21,则通过公式计算,所以和toString()的返回值不一定相同(两者均不精准)

    (1000000000000000128).toString() === "1000000000000000100"
    (1000000000000000128).toFixed(0) === "1000000000000000128"
    (1000000000000000100).toString() === "1000000000000000100"
    (1000000000000000100).toFixed(0) === "1000000000000000128"

        Number.prototype.toPrecision([precision]):DOMString,返回指定精度的是十进制字数字符串。

          注意:精度过高或过低都会引发数值的不精准。

    (100.1).toPrecision(1) === "1e+2"
    (100.1).toPrecision(17) === "100.09999999999999"

        Number.prototype.toExponential(fractionDigits):DOMString,返回指定精度的是十进制字数科学计数法字符串

          注意:精度过高或过低都会引发数值的不精准。

    (100.1).toExponential(1) === "1.001e+2"
    (100.1).toPrecision(16) === "1.0009999999999999e+2"

    Consolusion                          

      尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5130876.html 肥子John^_^

    Thanks                              

    http://es6.ruanyifeng.com/#docs/number

    http://es5.github.io/#x15.7.4.5

  • 相关阅读:
    TCP/IP断网仍然显示连通状态禁止“媒体感知”
    ASP.NET页面优化,提高载入速度方法大全
    国家气象局提供
    datatable&list<T>
    windows mobile C# net3.5 如何捕捉Arrow的CheckBox的KeyDown事件?
    hhclass 类 RAPI OpenNETCF.Desktop.Communication.DLL相关下载
    string和stringBuilder区别
    windows mobile全屏设置笔记
    CSS浮动(float,clear)通俗讲解
    js图片延时加载(jquery特效)
  • 原文地址:https://www.cnblogs.com/fsjohnhuang/p/5130876.html
Copyright © 2011-2022 走看看