1 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊
您遇到了精度問(wèn)題。在 PHP 中,您永遠(yuǎn)不應(yīng)該相信浮點(diǎn)數(shù)的最后一位數(shù)字。
從手冊(cè)(浮點(diǎn)數(shù))中,第二段甚至有關(guān)于您的特定測(cè)試數(shù)字的一點(diǎn):
浮點(diǎn)數(shù)的精度有限。雖然這取決于系統(tǒng),但 PHP 通常使用 IEEE 754 雙精度格式,由于按 1.11e-16 的順序舍入,這將給出最大相對(duì)誤差。非初等算術(shù)運(yùn)算可能會(huì)產(chǎn)生較大的誤差,當(dāng)然,當(dāng)多個(gè)運(yùn)算復(fù)合時(shí),必須考慮誤差傳播。
此外,可以精確表示為以 10 為基數(shù)的浮點(diǎn)數(shù)的有理數(shù)(例如 0.1 或 0.7),沒(méi)有精確表示為以 2 為基數(shù)的浮點(diǎn)數(shù)(無(wú)論尾數(shù)的大小如何,在內(nèi)部使用)。因此,它們無(wú)法在不損失少量精度的情況下轉(zhuǎn)換為內(nèi)部二進(jìn)制對(duì)應(yīng)項(xiàng)。這可能會(huì)導(dǎo)致令人困惑的結(jié)果:例如,floor((0.1+0.7)*10) 通常會(huì)返回 7 而不是預(yù)期的 8,因?yàn)閮?nèi)部表示類似于 7.9999999999999991118...
因此,永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果到最后一位,也不要直接比較浮點(diǎn)數(shù)是否相等。如果需要更高的精度,可以使用任意精度數(shù)學(xué)函數(shù)和 gmp 函數(shù)。
- 1 回答
- 0 關(guān)注
- 118 瀏覽
添加回答
舉報(bào)