首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 四捨五入三大方法完整比較:round、number_format、sprintf

     編輯:PHP 綜合知識

快速選擇指南

需求推薦函式範例
純數值計算、保留 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
?>

總結建議

  1. 計算過程:使用 round() 或 BCMath/整數分單位
  2. 資料庫儲存:使用 DECIMAL(10,2) 或整數分單位
  3. 前端顯示:number_format()(含千分位)或 sprintf()(模板嵌入)
  4. API 回傳:建議回傳字串格式金額(如 "1234.50")避免 JSON 序列化精度損失

掌握三者差異與適用場景,能避免常見的「金額顯示少一分」或「計算誤差累積」問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved