簡體   English   中英

PHP中條件的奇怪行為

[英]Strange behaviour of conditions in PHP

我想知道為什么下面的代碼輸出:

$a = log(5, 5);
$b = round(log(5, 5));
echo 'a: ';
var_dump($a);
echo '<br>';
echo 'b: ';
var_dump($b);
echo '<br>';
echo ($a == $b) ? 'equal' : 'not equal';

這個

a: float(1) 
b: float(1) 
not equal

感謝任何可以向我解釋這一點的人。

僅引用PHP手冊中的浮點數一章:

警告浮點精度

浮點數的精度有限。 盡管它取決於系統,但PHP通常使用IEEE 754雙精度格式,由於舍入為1.11e-16的順序,它將提供最大的相對誤差。 非基本算術運算可能會產生較大的錯誤,並且,當然,在合並多個運算時必須考慮錯誤傳播。

此外,在底數10中可精確表示為浮點數的有理數(如0.1或0.7)在底數2中沒有作為浮點數的精確表示,內部使用,而不考慮尾數的大小。 因此,如果不損失一點點精度,就不能將它們轉換為內部二進制副本。 這可能導致混亂的結果:例如,floor((0.1 + 0.7)* 10)通常返回7而不是預期的8,因為內部表示形式類似於7.9999999999999991118 ....

因此,永遠不要將浮點數結果信任到最后一位,並且不要直接比較浮點數是否相等。 如果需要更高的精度,則可以使用任意精度的數學函數和gmp函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM