Javascript 不可不知的祕密 系列(1)——數字

1. 整數,浮點數

  • ECMAScript 中並不區分整數與浮點數,全部數值字面量用浮點數表示code

  • ECMAScript 標準中支持十進制,十六進制,不支持八進制;在strict模式下,嚴格禁止八進制。不過有些js實現支持八進制,不過並不建議你們去用。對象

##2. 邊界值與運算異常ip

  • JS 中對於運算異常( 上溢,下溢,除0 等)不會報錯,只會返回某些特定的數值
  • JS 中定義了 Infinity(無窮大) , NaN(非數值) 表示這些特殊值,並提供 isInfinity(),isFinite(), isNaN() 全局方法判斷,而不能使用 == 運算符判端
  • ECMAScript 3 中 Infinity,NaN 是可讀寫屬性,在ECMAScript 5 中被修正
  • 另外, Number 對象也定義了一些數字相關的靜態屬性: Number.POSITIVE_INFINITY ,Number.MAX_VALUE ,Number.NaN 等

##3. 尷尬的二進制浮點數與四捨五入it

  • ECMAScript 中採用 二進制表示法(IEEE-754)來表示浮點數和整數,對於整數的精度是足夠使用的,可是對於浮點數的精度,只能無限接近,不能徹底相等;
  • 在浮點數字面量比較的時候,是沒有問題的,例如 0.3 == 0.3 ; (true)
  • 在比較浮點數運算結果的時候,是有問題的,例如 0.2 - 0.1 == 0.3 - 0.2 ; (false) 這是因爲運算的結果是無限接近的,可是不可能徹底相等;
  • 字面量與計算結果相比較,是沒有問題的,例如 0.2 - 0.1 == 0.1 ; (true), 雖然通過了運算,可是比較的對方是字面量
  • 考慮到上述狀況,在對數字精確要求很高的系統中,建議儘可能避免浮點數,而是採用整數間的運算來規避,好比在貨幣運算中,採用最小的貨幣單位 分 ,而不是 元,來規避儘量的小數;另外就是必定要使用浮點數的狀況,能夠使用 Math 中的方法來限定精確度以後再比較。
相關文章
相關標籤/搜索