第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

PHP var_dump 不一致,浮點(diǎn)計(jì)算的樓層結(jié)果錯(cuò)誤

PHP var_dump 不一致,浮點(diǎn)計(jì)算的樓層結(jié)果錯(cuò)誤

PHP
大話西游666 2023-09-08 14:33:00
對(duì)于這段代碼:$value = 200.1;$denominator = 0.1;echo "value: $value\n";echo "denominator: $denominator\n";$resultInt = ($value / $denominator);echo "($value / $denominator) = ";printf ("%f\n", $resultInt);$resultInt = (int) ($value / $denominator);echo "(int) ($value / $denominator) = ";printf ("%f\n", $resultInt);$resultInt = floor($value / $denominator);echo "floor($value / $denominator) = ";printf ("%f\n", $resultInt);$resultInt = floor((int) ($value / $denominator));echo "floor((int) ($value / $denominator)) = ";printf ("%f\n", $resultInt);$resultInt = floor((float) 2001);echo "floor((float) 2001) = ";printf ("%f\n", $resultInt);$resultInt = round($value / $denominator, PHP_ROUND_HALF_DOWN);echo "round($value / $denominator, PHP_ROUND_HALF_DOWN) = ";printf ("%f\n", $resultInt);$valueMul = $resultInt * $denominator;if ($valueMul !== $value) {    echo "they are not the same\n";    var_dump($value);    var_dump($valueMul);}$valueDiff = $value - $valueMul;if ($valueDiff !== 0) {    echo "valueDiff is not zero\n";    var_dump($valueDiff);}我有這個(gè)結(jié)果:value: 200.1denominator: 0.1(200.1 / 0.1) = 2001.000000(int) (200.1 / 0.1) = 2000.000000floor(200.1 / 0.1) = 2000.000000floor((int) (200.1 / 0.1)) = 2000.000000floor((float) 2001) = 2001.000000round(200.1 / 0.1, PHP_ROUND_HALF_DOWN) = 2001.000000they are not the samefloat(200.1)float(200.1)valueDiff is not zerofloat(-2.8421709430404E-14)上述所有計(jì)算的預(yù)期結(jié)果是 2001,但在某些情況下它是 2000。我知道由于計(jì)算機(jī)在二進(jìn)制上運(yùn)行,因此分?jǐn)?shù)不會(huì)以小數(shù)形式存儲(chǔ)在變量中。但正如地板手冊(cè)所述:地板 -向下舍入分?jǐn)?shù)因此我期望得到與以下相同的結(jié)果:round(200.1 / 0.1, PHP_ROUND_HALF_DOWN)但 round 按預(yù)期返回 2001,而下限返回 2000(錯(cuò)誤)。你知道為什么嗎?我還發(fā)現(xiàn)這var_debug是不一致的:
查看完整描述

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ù)。

查看完整回答
反對(duì) 回復(fù) 2023-09-08
  • 1 回答
  • 0 關(guān)注
  • 118 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)