| 需求 | 推薦函式 | 範例 |
|---|---|---|
| 純數值計算、保留 N 位小數 | round() | round(3.14159, 2) // 3.14 |
| 金額顯示、千分位分隔、指定小數點符號 | number_format() | number_format(1234.5, 2, '.', ',') // 1,234.50 |
| 字串模板內嵌數值、固定寬度、零填充 | sprintf() | sprintf('價格: %0.2f 元', 9.5) // 價格: 9.50 元 |
round() - 數值運算首選<?php
$val = 1234.5678;
echo round($val, 2); // 1234.57 (四捨五入)
echo round($val, 0); // 1235 (四捨五入至整數)
echo round($val, -1); // 1230 (十位四捨五入)
echo round($val, -2); // 1200 (百位四捨五入)
// PHP 模式:ROUND_HALF_UP (預設)、ROUND_HALF_DOWN、ROUND_HALF_EVEN、ROUND_HALF_ODD
echo round(1.5, 0, PHP_ROUND_HALF_UP); // 2
echo round(1.5, 0, PHP_ROUND_HALF_EVEN); // 2 (銀行家捨入)
echo round(2.5, 0, PHP_ROUND_HALF_EVEN); // 2 (銀行家捨入)
?>
特點: 回傳 float,適合後續數學運算;支援多種捨入模式(PHP 5.3+)。
number_format() - 顯示格式化專用<?php
$val = 1234.5678;
// 基本用法:保留 2 位小數
echo number_format($val, 2); // 1,234.57 (預設千分位逗號、小數點)
// 自訂分隔符號(歐洲習慣:空格分千位、逗號做小數點)
echo number_format($val, 2, ',', ' '); // 1 234,57
// 無千分位分隔
echo number_format($val, 2, '.', ''); // 1234.57
// 負數處理
echo number_format(-1234.5678, 2); // -1,234.57
?>
特點: 回傳 string,**不適合直接用於數學運算**;自動四捨五入;支援自訂千分位與小數點符號(適合多語系金額顯示)。
sprintf() / printf() - 字串模板嵌入<?php
$price = 123.1;
$name = '張三';
// 基本格式化
echo sprintf('%s 有 $%01.2f', $name, $price); // 張三 有 $123.10
// 進階:寬度、對齊、零填充
echo sprintf('[%10.2f]', 9.5); // [ 9.50] (右對齊,寬度 10)
echo sprintf('[%-10.2f]', 9.5); // [9.50 ] (左對齊)
echo sprintf('[%010.2f]', 9.5); // [0000009.50] (零填充)
// 多幣別範例
$currencies = [
'TWD' => ['symbol' => 'NT$', 'decimals' => 0],
'USD' => ['symbol' => '$', 'decimals' => 2],
'JPY' => ['symbol' => '¥', 'decimals' => 0],
];
foreach ($currencies as $code => $conf) {
$fmt = "%s %s%.'{$conf['decimals']}f";
echo sprintf($fmt, $code, $conf['symbol'], 1234.567) . "\n";
}
// TWD NT$1235
// USD $1234.57
// JPY ¥1235
?>
常用格式代碼:
%f:浮點數(預設 6 位小數)%.2f:固定 2 位小數%0.2f:同 %.2f%10.2f:寬度 10、右對齊%-10.2f:寬度 10、左對齊%010.2f:寬度 10、零填充浮點數精度陷阱:
<?php
echo 0.1 + 0.2; // 0.30000000000000004
echo round(0.1 + 0.2, 2); // 0.3 (看似正確,但內部仍有誤差)
// 正確做法:使用 BCMath 或整數分單位
// 1. BCMath 任意精度
echo bcadd('0.1', '0.2', 2); // 0.30
// 2. 整數分單位(推薦)
$priceCents = 199; // $1.99
$taxCents = round($priceCents * 0.05); // 10 cents
$totalCents = $priceCents + $taxCents; // 209 cents = $2.09
echo '$' . ($totalCents / 100); // $2.09
?>
round() 或 BCMath/整數分單位DECIMAL(10,2) 或整數分單位number_format()(含千分位)或 sprintf()(模板嵌入)"1234.50")避免 JSON 序列化精度損失掌握三者差異與適用場景,能避免常見的「金額顯示少一分」或「計算誤差累積」問題。