###### tags: `javascript`, `front-end` # 【自學筆記】關於JavaScipt的小數點陷阱 直接先看例子 ```javascript= a = 1 + 2 console.log(a) // 3 ``` 整數加整數,再正常不過 然而今天用小數點相加的話... ```javascript= a = 0.1 + 0.2 console.log(a) ``` 應該是會吐出0.3才是... :::danger 但實際測試後,console吐出的的竟然是 0.30000000000000004 ::: <font style="font-weight:bold;font-size:22px">昂? 這咋回事兒:thinking_face::thinking_face::thinking_face:</font> 首先,因為Javascript使用Number型態表示數字(整數及浮點數) 並遵循 [IEEE 754標準](https://zh.wikipedia.org/wiki/IEEE_754),以64位表示一個數字 再來,電腦無法直接對十進制做運算,這是目前的硬體條件沒辦法 所以一個簡單的運算就會分成兩個部分: :::info 進制轉換 ::: 不贅述二進制轉換的細節了 總之0.1跟0.2轉成二進制的話 ```javascript= 0.1 => 0.0001100110011001...(無限循環) 0.2 => 0.0011001100110011...(無限循環) ``` 然後因為[IEEE 754標準](https://zh.wikipedia.org/wiki/IEEE_754)有尾數位的限制,==後方多餘的位數會被截掉== 所以在這個轉換的過程中,精度就已經丟失了 :::info 對階運算 ::: 轉換完後就會做對階運算,但由於==指數位數不同==也可能導致精度丟失 按照計算後(包含丟失)得到的結果會是 ```javascript= 0.0100110011001100110011001100110011001100110011001100 ``` 轉換為十進制後就是 ```javascript= 0.30000000000000004 ``` 所以才會發生0.1+0.2 != 0.3的狀況啦! :::success 總結 ::: 由於電腦存儲的==基底都是二進制==,需要先把十進制轉換成二進制才能做儲存&運算,這個轉換過程中,類似0.1、0.2這樣轉換後是無窮的就無法用二進制精確表示。 Javascript採用IEEE754標準能儲存的==有效位數為52位==,所以無可避免導致精度丟失,另外在做對階運算時也會產生精度丟失的情況 >備註:不只有Javascript有這問題,只要是遵循IEEE754標準的程式都一樣哦 --- *新手工程師的筆記,純粹記錄學了些啥東西 如果有前輩高人讀了我的文,文中有任何錯誤再麻煩指教指教*