在js中,保留兩位小數(shù)的方法有很多種,在開發(fā) 快捎 項(xiàng)目時(shí),在一處數(shù)據(jù)處理中,使用了類似如下代碼:
var realPrice = 2.51; //其中一個(gè)示例值
var targetPrice = parseInt(realPrice * 100) / 100;
console.log(">>>", targetPrice);
本來是為了確保把realPrice保留兩位小數(shù)后賦值給targetPrice, 但發(fā)現(xiàn)結(jié)果并不是這樣,在控制臺(tái)輸出如下:

image.png
不應(yīng)該是2.51么?
我把realPrice的值換成2.51111, 然后測試,結(jié)果輸出正常的2.51。
怎么回事?不是說程序是不會(huì)騙人的嗎?
本著打破砂鍋問到底的好(zhuang)學(xué)(bi)心態(tài), 我做了如下的測試:
var realPrice = 2.51; //其中一個(gè)示例值
console.log(parseInt(realPrice * 100))
得到結(jié)果依然是2.5。
繼續(xù)往下:
var realPrice = 2.51; //其中一個(gè)示例值
console.log(realPrice * 100)
得到如下結(jié)果:

image.png
終于知道是何故了。
當(dāng)一個(gè)浮點(diǎn)數(shù)與任何Number數(shù)據(jù)進(jìn)行運(yùn)算時(shí),都可能會(huì)產(chǎn)生精度不準(zhǔn)確的問題,以上就是一個(gè)例子。而parseInt函數(shù)會(huì)直接把Number類型的數(shù)據(jù)進(jìn)行 舍尾 取值。自然而然地,parseInt(realPrice * 100)的結(jié)果是250了,最終```targetPrice``結(jié)果也就是2.5了。
提醒:js中凡是使用浮點(diǎn)數(shù)進(jìn)行運(yùn)算的,都應(yīng)該留意其精度產(chǎn)生的誤差,避免對(duì)計(jì)算結(jié)果造成影響!!!
? 解決方案
- 把
parseInt函數(shù)替換成Math.round函數(shù)。 - 使用
+realPrice.toFixed(2)。