在財務計算、統計展示、百分比格式化等場景中,數值精度控制是常見需求。PHP 內建 round() 函數提供靈活的四捨五入能力,支援正負精度參數,配合字符串格式化可輕鬆實現「保留一位小數並加百分號」等常見需求。
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )
$val:待處理數值$precision:小數位數(可為負數,表示十位、百位捨入)$mode:捨入模式(PHP 5.3+),可選 PHP_ROUND_HALF_UP(默認)、PHP_ROUND_HALF_DOWN、PHP_ROUND_HALF_EVEN、PHP_ROUND_HALF_ODDecho round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000 (百位捨入)
// 百分比格式化:0.10456 → 10.5%
$num = 0.10456;
echo round($num * 100, 1) . '%'; // 輸出: 10.5%
PHP 浮點數遵循 IEEE 754 標準,存在精度誤差:
echo round(2.675, 2); // 預期 2.68,實際輸出 2.67
解決方案:
echo bcdiv(bcmul('2.675', '100'), '1', 2); // 2.68
echo number_format(2.675, 2, '.', ''); // 2.68
function round_chinese($val, $precision = 0) {
// 解決 2.675 → 2.68 問題
$factor = pow(10, $precision + 1);
$temp = (int)($val * $factor);
$last_digit = $temp % 10;
$temp = (int)($temp / 10);
if ($last_digit >= 5) $temp++;
return $temp / pow(10, $precision);
}
echo round_chinese(2.675, 2); // 2.68
round() 或 number_format() 足矣precision 為負數時的捨入行為(十位、百位)$mode 參數控制「銀行家捨入」等特殊規則