4 回答

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
我該怎么做才能避免這個(gè)問(wèn)題?
這取決于你正在做什么樣的計(jì)算。
如果你真的需要你的結(jié)果準(zhǔn)確地加起來(lái),特別是當(dāng)你使用錢(qián)時(shí):使用特殊的十進(jìn)制數(shù)據(jù)類(lèi)型。
如果您只是不想看到所有這些額外的小數(shù)位:只需將結(jié)果格式化為顯示它時(shí)固定的小數(shù)位數(shù)。
如果您沒(méi)有可用的十進(jìn)制數(shù)據(jù)類(lèi)型,則可以選擇使用整數(shù),例如完全以美分進(jìn)行貨幣計(jì)算。但這是更多的工作,并有一些缺點(diǎn)。
請(qǐng)注意,第一點(diǎn)僅適用于您確實(shí)需要特定的精確十進(jìn)制行為。大多數(shù)人并不需要這樣,他們只是因?yàn)樗麄兊某绦驘o(wú)法正常使用1/10這樣的數(shù)字而沒(méi)有意識(shí)到如果它以1/3發(fā)生它們甚至不會(huì)眨眼同樣的錯(cuò)誤。
如果第一點(diǎn)確實(shí)適用于您,請(qǐng)使用BigDecimal for JavaScript,這根本不是優(yōu)雅的,但實(shí)際上解決了問(wèn)題而不是提供不完美的解決方法。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
我喜歡Pedro Ladaria的解決方案并使用類(lèi)似的東西。
function strip(number) { return (parseFloat(number).toPrecision(12));}
與Pedros解決方案不同,這將向上舍入0.999 ...重復(fù)并且在最低有效數(shù)字上精確到正/負(fù)1。
注意:處理32位或64位浮點(diǎn)數(shù)時(shí),應(yīng)使用toPrecision(7)和toPrecision(15)以獲得最佳結(jié)果。有關(guān)原因,請(qǐng)參閱此問(wèn)題。

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
你只是在進(jìn)行乘法運(yùn)算嗎?如果是這樣,那么你可以利用一個(gè)關(guān)于十進(jìn)制算術(shù)的巧妙秘密。就是這樣NumberOfDecimals(X) + NumberOfDecimals(Y) = ExpectedNumberOfDecimals
。也就是說(shuō),如果我們有,0.123 * 0.12
那么我們知道將有5個(gè)小數(shù)位,因?yàn)?code>0.123有3個(gè)小數(shù)位并且0.12
有兩個(gè)。因此,如果JavaScript給了我們一個(gè)數(shù)字,0.014760000002
我們可以安全地舍入到小數(shù)點(diǎn)后第五位,而不用擔(dān)心會(huì)失去精度。
添加回答
舉報(bào)