在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)輸出如下:
不應(yīng)該是2.51
么?
我把realPrice
的值換成2.51111
, 然后測(cè)試巩梢,結(jié)果輸出正常的2.51
创泄。
怎么回事?不是說程序是不會(huì)騙人的嗎括蝠?
本著打破砂鍋問到底的好(zhuang)學(xué)(bi)心態(tài), 我做了如下的測(cè)試:
var realPrice = 2.51; //其中一個(gè)示例值
console.log(parseInt(realPrice * 100))
得到結(jié)果依然是2.5
鞠抑。
繼續(xù)往下:
var realPrice = 2.51; //其中一個(gè)示例值
console.log(realPrice * 100)
得到如下結(jié)果:
終于知道是何故了。
當(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)
字柠。