想要在JavaScript中對數字進行精確的加減乘除運算,就需要使用浮點數(float)。但是JavaScript在處理浮點數時可能會出現精度問題,比如:
console.log(0.1 + 0.2); // 0.30000000000000004 console.log(1.0 - 0.9); // 0.09999999999999998 console.log(0.7 * 0.1); // 0.07000000000000001 console.log(0.8 / 0.1); // 7.999999999999999
上面的結果顯然與數學的預期不符,這是因為JavaScript中采用IEEE 754標準進行浮點數表示和運算,但是這個標準并不是精確的。
那么,在JavaScript中如何避免這種精度問題呢?下面有幾個方法:
方法一:使用Math庫函數
在進行加減乘除運算時,可以使用Math庫函數進行處理。其中,Math.round()可以對數字四舍五入:
console.log(Math.round(0.1*10 + 0.2*10)/10); // 0.3 console.log(Math.round(1.0*10 - 0.9*10)/10); // 0.1 console.log(Math.round(0.7*10 * 0.1*10)/100); // 0.07 console.log(Math.round(0.8*10 / 0.1*10)/10); // 8
上面的代碼中,乘以10是為了將小數位移到整數位,然后使用Math.round()進行四舍五入,最后除以10或者100將小數位還原。
方法二:使用toFixed()函數
另一種方法是使用toFixed()函數,它可以將數字保留指定的小數位:
console.log((0.1 + 0.2).toFixed(1)); // 0.3 console.log((1.0 - 0.9).toFixed(1)); // 0.1 console.log((0.7 * 0.1).toFixed(2)); // 0.07 console.log((0.8 / 0.1).toFixed(0)); // 8
注意,使用toFixed()函數會將結果轉換為字符串,所以需要注意數據類型。
方法三:使用第三方庫
除此之外,還可以使用第三方庫來處理浮點數精度問題,比如Big.js、Decimal.js等。
使用Big.js的示例代碼如下:
var num1 = new Big(0.1); var num2 = new Big(0.2); console.log(num1.plus(num2).toString()); // 0.3
使用Decimal.js的示例代碼如下:
var num1 = new Decimal(0.1); var num2 = new Decimal(0.2); console.log(num1.plus(num2).toString()); // 0.3
經過上述處理,就可以讓JavaScript在處理浮點數時更加精確。
上一篇div 彈出 位置