PHP中的8%-3為什么等于0?
在PHP中,對(duì)于一些簡(jiǎn)單的數(shù)學(xué)運(yùn)算,我們總是希望能夠得到正確的結(jié)果。然而,有時(shí)候一些簡(jiǎn)單的運(yùn)算結(jié)果卻讓我們感到困惑。就像在PHP中,計(jì)算8%-3的結(jié)果卻是0一樣。為什么會(huì)出現(xiàn)這種情況呢?
要了解這個(gè)問(wèn)題,首先要了解取模運(yùn)算的定義。在數(shù)學(xué)中,取模運(yùn)算即求余數(shù),通常表示為”a mod n”,其中a為被除數(shù),n為除數(shù)。取模運(yùn)算的結(jié)果是一個(gè)非負(fù)整數(shù),范圍從0到n-1。例如,9 mod 4的結(jié)果是1,因?yàn)?除以4等于2余1。
而在PHP中,取模運(yùn)算使用%符號(hào)表示。根據(jù)PHP手冊(cè)的說(shuō)明,取模運(yùn)算的結(jié)果符號(hào)與被除數(shù)相同。也就是說(shuō),如果被除數(shù)是正數(shù),則結(jié)果也是正數(shù);如果被除數(shù)是負(fù)數(shù),則結(jié)果也是負(fù)數(shù)。
回到我們的問(wèn)題,8除以3等于2余2。根據(jù)取模運(yùn)算的定義,結(jié)果應(yīng)該是2。但是在PHP中,8%-3的結(jié)果卻是0,這是否違背了取模運(yùn)算的定義呢?
其實(shí),這種現(xiàn)象并不是PHP獨(dú)有的,而是取模運(yùn)算的一種定義方式。在某些編程語(yǔ)言中,取模運(yùn)算的結(jié)果可以是負(fù)數(shù)。具體的定義方式會(huì)根據(jù)編程語(yǔ)言的規(guī)范而有所不同。在PHP中,使用的是取模運(yùn)算的”向零舍入”規(guī)則。
根據(jù)PHP手冊(cè)的說(shuō)明,當(dāng)被除數(shù)是正數(shù)時(shí),取模運(yùn)算的結(jié)果等于被除數(shù)與除數(shù)的余數(shù);當(dāng)被除數(shù)是負(fù)數(shù)時(shí),取模運(yùn)算的結(jié)果等于被除數(shù)除以除數(shù)取整后的結(jié)果與0的較大者的余數(shù)。也就是說(shuō),PHP的取模運(yùn)算結(jié)果總是比被除數(shù)的絕對(duì)值小,但是符號(hào)與被除數(shù)相同。
那么,回到8%-3這個(gè)例子。8是正數(shù),-3是負(fù)數(shù)。根據(jù)”向零舍入”規(guī)則,取模運(yùn)算的結(jié)果應(yīng)該是8除以-3取整后的結(jié)果與0的較大者的余數(shù)。而8除以-3取整的結(jié)果是-3,與0比較較大者仍然是0。
因此,8%-3的結(jié)果等于0。
這種定義方式在一些場(chǎng)景下能夠簡(jiǎn)化代碼的邏輯,但也容易讓人誤解。如果我們希望得到正數(shù)的余數(shù),可以使用PHP提供的函數(shù)fmod()來(lái)實(shí)現(xiàn),它返回浮點(diǎn)數(shù)除法的余數(shù)。
總結(jié)一下,PHP中的8%-3等于0是由于取模運(yùn)算的定義方式,即”向零舍入”規(guī)則所決定的。要理解這種現(xiàn)象,我們需要了解所使用編程語(yǔ)言的取模運(yùn)算的規(guī)范,并根據(jù)實(shí)際情況選擇適當(dāng)?shù)倪\(yùn)算方式。






