先出道題:
<?php
echo intval(( (0.1+0.7) * 10 ));
?>
會輸出多少?8?7!
在講為什麼前先再重溫一下php的int
整型(integer)的形式描述:
decimal : [1-9][0-9]*
| 0hexadecimal : 0[xx][0-9a-fa-f]+
octal : 0[0-7]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
自 php 4.4.0 和 php 5.0.5後,最大值可以用常量php_int_max來表示。
<?php
var_dump(01090); // 八進位制 010 = 十進位制 8
?>
如果向八進位制數傳遞了乙個非法數字(即 8 或 9),則後面其餘數字會被忽略。
再來溫故一下float
浮點數的形式表示:
lnum [0-9]+
dnum ([0-9]*[\.]) | ([\.][0-9]*)
exponent_dnum [+-]?(( | ) [ee][+-]? )
顯然簡單的十進位制分數如同 0.1 或 0.7不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果:例如,floor((0.1+0.7)*10)通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9。
這和乙個事實有關,那就是不可能精確的用有限位數表達某些十進位制分數。例如,十進位制的 1/3 變成了 0.3。
所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式。
PHP手冊 關於浮點數精度的警告
以下第乙個按理會返回8結構是7 為什麼呢 int 0.1 0.7 10 7 int 0.1 0.6 10 7 查了php手冊發現如下,才了解 顯然簡單的十進位制分數如同 0.1 或 0.7不能在不丟失一點點精度的情況下轉換為內部二進位制的格式。這就會造成混亂的結果 例如,floor 0.1 0.7 ...
PHP 浮點數的精度
浮點數的精度有限。儘管取決於系統,php 通常使用 ieee 754 雙精度格式,則由於取整而導致的最大相對誤差為 1.11e 16。非基本數 算可能會給出更大誤差,並且要考慮到進行復合運算時的誤差傳遞。此外,以十進位制能夠精確表示的有理數如 0.1 或 0.7,無論有多少尾數都不能被內部所使用的二...
PHP浮點數運算精度問題
最近有客戶反應 訂單金額總是不準確,總是相隔一分錢。檢查相關 邏輯都是正確的,就是運用了四則運算。大概推測問題可能出在浮點計算丟失精度。在 php程式設計師雷雪松的部落格 中寫過一篇關於js精度不準確的文章 js中浮點數運算不精準 下面php程式設計師雷雪松詳細的介紹一下如何解決php浮點數運算精度...