浮點數的精度有限。儘管取決於系統,PHP 一般使用 IEEE 754 雙精度格式,則因爲取整而致使的最大相對偏差爲 1.11e-16。非基本數學運算可能會給出更大偏差,而且要考慮到進行復合運算時的偏差傳遞。
此外,以十進制可以精確表示的有理數如 0.1 或 0.7,不管有多少尾數都不能被內部所使用的二進制精確表示,所以不能在不丟失一點點精度的狀況下轉換爲二進制的格式。這就會形成混亂的結果:例如,floor((0.1+0.7)*10) 一般會返回 7 而不是預期中的 8,由於該結果內部的表示實際上是相似 7.9999999999999991118...。
因此永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。若是確實須要更高的精度,應該使用任意精度數學函數或者 gmp 函數。
參見http://us1.php.net/floatphp
四捨五入的round函數精度化函數
function bcround($strval, $precision = 0) {.net
if (false !== ($pos = strpos($strval, '.')) && (strlen($strval) - $pos - 1) > $precision) {
$zeros = str_repeat("0", $precision);
return bcadd($strval, "0.{$zeros}5", $precision);
} else {
return $strval;
}
}ci