JavaScript數據精度缺失問題

說到數據精度缺失的問題,就想起今年夏天剛轉正作的一個項目。當時的需求涉及到金額的計算,那時候對js的瞭解比如今還少,不過當時關於金額計算這塊js函數的封裝是項目裏架構師寫的,印象很深,當時他就直呼:被JS精度缺失坑了一把!最近看資料又接觸到精度缺失,那就本身站在巨人們的肩膀上整理一下。算法

JS中數據類型Number

不像Java,數字型的數據類型有short,int,long,float,double等,數字類型的數據在JS中只有一種數據類型——Number。那它的底層是怎麼表示的呢?咱們參考菜鳥教程的一段話,它是這麼說的:架構

JavaScript採用IEEE754標準定義的64位浮點格式表示數字,它能表示最大值爲±1.7976931348623157 x
10308,最小值爲±5 x 10 -324。

數據的存儲格式用圖形表示以下↓
圖片描述函數

(這裏先給本身留個坑,等搞清楚了具體的浮點數計算方法後再填……)工具

實例演示講解

咱們在控制檯上作以下的十進制的加法運算,以下圖所示spa

clipboard.png

表面上咱們作的是十進制的加法,實際上計算機在底層把它換算成了二進制,再作運算。可是0.1和0.2用二進制表示的話位數是沒法窮盡的。所以咱們看到的0.1用二進制表示的某數只是真實的0.1的一個近似數。0.2也是這個道理。因此實際上0.1+0.2是兩個近似數的相加,所以這個結果也就是0.3的近似數啦。這裏不作十進制小數轉二進制的詳細算法,感興趣的小夥伴能夠繼續深刻研究。教程

遇到這種問題,如何解決

  • 10的n次冪運算
    把數字乘以10的n次冪,轉換成計算機可以精確識別的整數,以後再除以相同的10的n次冪。

clipboard.png

  • number-precision
    這是一個挺好用的JS數據運算工具,它也是爲了解決JS數據精度缺失而產生的。用法以下(官網的截圖)

圖片描述

相關文章
相關標籤/搜索