簡體   English   中英

PHP異常/奇怪的行為

[英]PHP anomaly/ weird behaviour

當我跑:

for($o=1;$o<=655;$o++){ $r = $r+0.01; echo $r." ";}

在某些時候,我得到:

...4.29 4.3 4.31 4.32 4.33 4.34 4.35 4.36 4.37 4.38 4.39 4.4
4.41 4.42 4.4299999999999 4.4399999999999 4.4499999999999
4.4599999999999 4.4699999999999 ...

但是當我跑步時:

for($o=1;$o<=5;$o+=0.01){ echo $o." "; }

異常開始於:

4.34 4.35 4.36 4.37 4.38 4.3899999999999 4.3999999999999

為什么添加是for循環的一部分,或者在for循環中有什么區別?

歡迎來到舍入錯誤的奇跡。

0.01並不能完全表示為有限二進制分數,因此如果將其重復添加到另一個浮點數,最終會得到舍入誤差。

您看到舍入誤差的具體點取決於所涉及數字的二進制展開如何產生舍入誤差。

浮點數學不能准確表示值。 看到這里

當數字“.01”轉換為64位IEEE 754二進制浮點時,結果為0.010000000000000000208166817117216851329430937767028809。 當$ r設置為0,並且將此近似值.01添加到其中100次時,結果為1.0000000000000006661338147750939242541790008544921875,這是由於添加期間的額外舍入誤差。

現在考慮$ r從這個值稍微超過1進一步增加,而$ o從它的起始值正好增加1.首先,因為$ r和$ o以不同的值開始,所以它們通常在以后具有不同的值。 其次,因為它們是不同的,因為增量被添加到它們中的每一個,它們在添加中的四舍五入中遇到不同的錯誤。 這種錯誤可能會強化或取消,導致$ r或$ o或多或少不同。

最后,PHP有一些判斷是否打印帶小數點后兩位數的數字的標准。 據推測,在某些時候,$ r或$ o的值與最接近的數字相距足夠遠,有兩個小數點,PHP決定它應該打印更多的數字。 如上所述,這發生在$ r和$ o的不同時間。

您可以使用Round()函數。 這是一個鏈接: http//php.net/manual/en/function.round.php

暫無
暫無

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

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