javascript中常用的數字類型是Number,可以表示整數和浮點數,但是當數字比較大時會出現精度丟失的問題,特別是18位以上的數字。例如下面的代碼:
console.log(9999999999999999); // 10000000000000000
這是因為javascript的Number類型采用的是IEEE754標準中的雙精度浮點數(64位二進制數),其中一部分表示指數,一部分表示尾數,因此最多只能表示53位二進制數,即15-16位十進制數。當超過這個范圍時,就會出現精度丟失的問題。
解決這個問題的方法有很多,常用的有以下幾種:
1. 使用字符串表示數字
可以使用字符串表示18位以上的數字,這樣就不會出現精度丟失的問題:
var num = '999999999999999999'; console.log(num); // '999999999999999999' console.log(num.length); // 18
需要注意的是,使用字符串表示數字無法進行加減乘除等數值計算,需要先將字符串轉換成數字類型。
2. 使用BigInt類型
BigInt是ES2020引入的新數據類型,可以表示任意大的整數,但是不能表示小數。BigInt的字面量后面加上n標記:
var num1 = 12345678901234567890n; var num2 = 90071992547409920n; console.log(num1 + num2); // 12435650893882077810n
注意,BigInt類型是個新的數據類型,有些舊瀏覽器不支持,需要使用polyfill或轉換成字符串使用。
3. 使用大數庫
大數庫是專門用來處理大數的庫,常用的有big.js、bignumber.js等:
// 使用big.js var Big = require('big.js'); var num1 = new Big('999999999999999999'); var num2 = new Big('12345678901234567890'); console.log(num1.plus(num2).toString()); // 13345678901234567889 // 使用bignumber.js var BigNumber = require('bignumber.js'); var num1 = new BigNumber('999999999999999999'); var num2 = new BigNumber('12345678901234567890'); console.log(num1.plus(num2).toString()); // 13345678901234567889
需要注意的是,使用大數庫會增加代碼復雜度和執行時間,不建議在小數值計算中使用。
總結
javascript中的Number類型在表示18位以上的數字時會出現精度丟失的問題,解決方法包括使用字符串表示數字、BigInt類型和大數庫。
下一篇php json 規范