浮点数的精度有限。尽管取决于系统,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