首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 微秒計時負數問題分析:float 精度誤差與正確計時姿勢

     編輯:MySQL 資料庫相關知識

問題現象

$start = microtime(true);
// SQL 查詢
$end = microtime(true);
$diff = $end - $start;  // 偶爾出現負數

根本原因

PHP float(IEEE 754 雙精度)無法精確表示某些十進制小數(如 0.1、0.7)。兩個極接近的浮點數相減,因二進制表示誤差導致結果為負。

// 經典案例
floor((0.1 + 0.7) * 10)  // 得 7 而非 8
// 內部實際為 7.99999999999999...

正確解決方案

方案一:microtime(true) 直接取得 float 秒數(PHP 5.0+)

$start = microtime(true);
// 執行查詢
$end = microtime(true);
$diff = $end - $start;  // 直接相減,精度足夠

microtime(true) 回傳含微秒的浮點秒數,避免字串拆解組合誤差。

方案二:高精度計時用 hrtime(PHP 7.3+)

$start = hrtime(true);  // 納秒陣列 [秒, 納秒] 或布林 true 回傳總納秒
// 執行查詢
$end = hrtime(true);
$diff_ns = $end - $start;
$diff_ms = $diff_ns / 1_000_000;  // 毫秒
$diff_sec = $diff_ns / 1_000_000_000;

方案三:BCMath 任意精度(舊版 PHP)

$start = microtime(true);
$end = microtime(true);
$diff = bcsub($end, $start, 6);  // 保留 6 位小數

最佳實踐建議

  • 優先使用 microtime(true) 簡單且精度足夠(微秒級)。
  • 效能分析建議用 xhprof、Blackfire、Tideways 專業工具。
  • 永遠不要用 == 比較兩個 float,用 abs($a - $b) < 0.000001。
  • 資料庫層面可用 SHOW PROFILE 或 EXPLAIN ANALYZE 取得精確執行時間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved