由于JavaScript 對(duì)Math使用IEEE 754 標(biāo)準(zhǔn)哮伟,因此它使用64位浮點(diǎn)數(shù)干花。這在執(zhí)行浮點(diǎn)(十進(jìn)制)計(jì)算時(shí)會(huì)導(dǎo)致精度錯(cuò)誤,簡而言之楞黄,由于計(jì)算機(jī)是二進(jìn)制運(yùn)算池凄,而不是十進(jìn)制。
0.1 + 0.2; // 0.300000004
// 0.1 ===> 0.0001100110011001100110011001100110011001100110011001101
// 0.2 ===> 0.001100110011001100110011001100110011001100110011001101
// 連個(gè)二進(jìn)制相加 ===> 0.0100110011001100110011001100110011001100110011001100111 轉(zhuǎn)換為十進(jìn)制 0.30000000000000004
// 就是因?yàn)?.0100110011001100110011001100110011001100110011001100111最后的一位1 導(dǎo)致0.00000000000000004
image.png
image.png
這個(gè)問題的一個(gè)簡單的解決方案是:
+(0.1 + 0.2).toFixed(1); // 0.3 (保留小數(shù)點(diǎn)后一位)
這里的數(shù)字加在一起鬼廓,返回錯(cuò)誤的浮點(diǎn)數(shù)肿仑,然后將其設(shè)置toFixed
為字符串"0.3"
。最后,+
符號(hào)將字符串轉(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