文章出處

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()