鍍金池/ 問答/PHP  C  網(wǎng)絡(luò)安全/ php中浮點(diǎn)轉(zhuǎn)整數(shù),為什么是向下取整,而不是四舍五入?

php中浮點(diǎn)轉(zhuǎn)整數(shù),為什么是向下取整,而不是四舍五入?

http://php.net/manual/zh/lang...

從浮點(diǎn)型轉(zhuǎn)換

當(dāng)從浮點(diǎn)數(shù)轉(zhuǎn)換成整數(shù)時(shí),將向下取整。

如果浮點(diǎn)數(shù)超出了整數(shù)范圍(32 位平臺(tái)下通常為 +/- 2.15e+9 = 2^31,64 位平臺(tái)下,除了 Windows,通常為 +/- 9.22e+18 = 2^63),則結(jié)果為未定義,因?yàn)闆]有足夠的精度給出一個(gè)確切的整數(shù)結(jié)果。在此情況下沒有警告,甚至沒有任何通知!

Note:
PHP 7.0.0 起,NaN 和 Infinity 在轉(zhuǎn)換成 integer 時(shí),不再是 undefined 或者依賴于平臺(tái),而是都會(huì)變成零。
Warning
絕不要將未知的分?jǐn)?shù)強(qiáng)制轉(zhuǎn)換為 integer,這樣有時(shí)會(huì)導(dǎo)致不可預(yù)料的結(jié)果。
<?php
echo (int) ( (0.1+0.7) * 10 ); // 顯示 7!
?>

回答
編輯回答
青黛色

PHP中float轉(zhuǎn)int是將小數(shù)位全部棄掉,(0.1+0.7)*10的結(jié)果內(nèi)部的表示其實(shí)是類似7.9999999999999991118…,于是強(qiáng)行轉(zhuǎn)換為int值時(shí),結(jié)果為7。

如果實(shí)在要轉(zhuǎn),最好使用round,進(jìn)行四舍五入避開浮點(diǎn)數(shù)精度的坑

echo (int)((0.7+0.1)*10);   // 輸出7
echo round((0.7+0.1)*10);   // 輸出8

注意:永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位,也永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等。如果確實(shí)需要更高的精度,應(yīng)該使用任意精度數(shù)學(xué)函數(shù)或者 gmp 函數(shù)。

2018年9月17日 04:04
編輯回答
離觴

因?yàn)閜hp是世界上最好的語(yǔ)言^_^

2018年3月17日 21:14