當(dāng)我們?cè)谟?jì)算機(jī)中使用浮點(diǎn)數(shù)進(jìn)行計(jì)算時(shí),特別是在使用二進(jìn)制表示浮點(diǎn)數(shù)時(shí),可能會(huì)出現(xiàn)舍入誤差。這是由于計(jì)算機(jī)使用有限的位數(shù)來表示浮點(diǎn)數(shù),而某些十進(jìn)制數(shù)無(wú)法精確地表示為有限的二進(jìn)制數(shù)。
0.1 和 0.2 都是無(wú)限循環(huán)的二進(jìn)制數(shù),在轉(zhuǎn)換為浮點(diǎn)數(shù)時(shí)并不能完全準(zhǔn)確地表示。將它們相加時(shí),可能會(huì)出現(xiàn)舍入誤差。因此,0.1 + 0.2 在 JavaScript 中的結(jié)果并不等于 0.3。
這是因?yàn)?0.1 在二進(jìn)制中是一個(gè)無(wú)限循環(huán)的數(shù),大約是 0.0001100110011001100110011001100110011001100110011...,而 0.2 在二進(jìn)制中也是一個(gè)無(wú)限循環(huán)的數(shù),大約是 0.001100110011001100110011001100110011001100110011...。當(dāng)計(jì)算機(jī)在進(jìn)行浮點(diǎn)數(shù)運(yùn)算時(shí),只能存儲(chǔ)有限的位數(shù),因此會(huì)發(fā)生舍入誤差。
當(dāng)需要在 JavaScript 中進(jìn)行精確的十進(jìn)制計(jì)算時(shí),一種常見的方法是將數(shù)字轉(zhuǎn)換為整數(shù)進(jìn)行計(jì)算,然后再將結(jié)果轉(zhuǎn)換回十進(jìn)制。這可以通過乘以一個(gè)適當(dāng)?shù)谋稊?shù)來實(shí)現(xiàn)。以下是一個(gè)例子:
// 將數(shù)字轉(zhuǎn)換為整數(shù)進(jìn)行計(jì)算
const num1 = 0.1;
const num2 = 0.2;
const multipliedNum1 = num1 * 10;
const multipliedNum2 = num2 * 10;
const sum = multipliedNum1 + multipliedNum2;
// 將結(jié)果轉(zhuǎn)換回十進(jìn)制
const result = sum / 10;
console.log(result); // 0.3
在這個(gè)例子中,我們將 0.1 和 0.2 分別乘以 10,得到整數(shù) 1 和 2。然后我們對(duì)這兩個(gè)整數(shù)進(jìn)行求和,得到整數(shù) 3。最后,我們將整數(shù) 3 除以 10,將結(jié)果轉(zhuǎn)換回十進(jìn)制,得到 0.3。
?
除了將數(shù)字轉(zhuǎn)換為整數(shù)進(jìn)行計(jì)算的方法,使用內(nèi)置的`toFixed()` 方法可以用于將浮點(diǎn)數(shù)四舍五入為指定小數(shù)位數(shù)的字符串表示。例如:
const num1 = 0.1;
const num2 = 0.2;
const sum = num1 + num2;
const result = sum.toFixed(1);
console.log(result); // 0.3
這種方法適用于簡(jiǎn)單的加法、減法和乘法運(yùn)算,畢竟數(shù)據(jù)進(jìn)行了取舍,結(jié)果可能會(huì)有偏差。
?文章來源:http://www.zghlxwxcb.cn/news/detail-466870.html
?
另外,一些 JavaScript 庫(kù)也提供了精確計(jì)算的功能,例如 BigNumber.js,這里就不展開介紹了。文章來源地址http://www.zghlxwxcb.cn/news/detail-466870.html
到了這里,關(guān)于為什么JS中0.1+0.2不等于0.3的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!