由于JavaScript 對Math使用IEEE 754 標(biāo)準(zhǔn),因此它使用64位浮點(diǎn)數(shù)。這在執(zhí)行浮點(diǎn)(十進(jìn)制)計算時會導(dǎo)致精度錯誤,簡而言之,由于計算機(jī)是二進(jìn)制運(yùn)算,而不是十進(jìn)制。
0.1 + 0.2; // 0.300000004
// 0.1 ===> 0.0001100110011001100110011001100110011001100110011001101
// 0.2 ===> 0.001100110011001100110011001100110011001100110011001101
// 連個二進(jìn)制相加 ===> 0.0100110011001100110011001100110011001100110011001100111 轉(zhuǎn)換為十進(jìn)制 0.30000000000000004
// 就是因為0.0100110011001100110011001100110011001100110011001100111最后的一位1 導(dǎo)致0.00000000000000004

image.png

image.png
這個問題的一個簡單的解決方案是:
+(0.1 + 0.2).toFixed(1); // 0.3 (保留小數(shù)點(diǎn)后一位)
這里的數(shù)字加在一起,返回錯誤的浮點(diǎn)數(shù),然后將其設(shè)置toFixed為字符串"0.3"。最后,+符號將字符串轉(zhuǎn)換回有效狀態(tài),Number以便可以再次處理它。
var x = 0.1,
y = 0.2;
var z = +(x + y).toFixed(1);
z += 0.1; // z is now 0.4