簡體   English   中英

PHP floor()怪異的行為

[英]PHP floor() weird behaviour

當對乘積求和時,與對普通數求和時得到的結果不同。 這是預期的行為嗎? 如果是,為什么?

$val1 = 29;
$val2 = 0.29*100;

echo floor($val1); // prints 29
echo floor($val2); // prints 28

在您的示例中,這是PHP中浮點精度的結果:

gettype($val1); 返回integer

gettype($val2); 返回double

將其與php.net上的此警告結合:

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

取自http://php.net/manual/en/language.types.float.php

我們可以看到您的樓層為何將其從28.9999999999等降低到28,而不是整數29到29。

它是PHP怪異規范的一部分。 這是正常的,具體取決於機器。

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

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

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

http://techiedan.com/2013/10/11/php-floor-function-float-value/

暫無
暫無

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

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