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

PHP 處理 MySQL 浮點數顯示技巧:移除多餘零、保留指定小數位、避免四捨五入

     編輯:PHP 相關知識

常見問題

MySQL FLOAT/DOUBLE 欄位讀取後,PHP 輸出常出現科學記號或多餘尾隨零(如 1001.3300000001)。

基礎處理函數

函數用途範例
floatval($val)轉為浮點數,移除字串前導零floatval('001.23') → 1.23
number_format($val, 2)格式化保留 2 位小數,**四捨五入**number_format(1.236, 2) → '1.24'
sprintf('%.2f', $val)同 number_format,四捨五入sprintf('%.2f', 1.236) → '1.24'

進階需求:保留小數但不四捨五入

金融/會計場景常需「捨去」而非「四捨五入」。自訂函數:

/**
 * 格式化浮點數:保留指定小數位,不四捨五入,不足補零
 * @param string|float $num 原始數值
 * @param int $decimals 保留小數位數(0 表示不限制,僅移除尾隨零)
 * @return string
 */
function formatFloat($num, $decimals = 0) {
    $num = (string)floatval($num);  // 正規化:移除科學記號、前導零
    if ($decimals > 0) {
        if (strpos($num, '.') === false) {
            $num .= '.' . str_repeat('0', $decimals);
        } else {
            list($int, $frac) = explode('.', $num);
            if (strlen($frac) > $decimals) {
                $frac = substr($frac, 0, $decimals);  // 直接截斷
            } elseif (strlen($frac) < $decimals) {
                $frac .= str_repeat('0', $decimals - strlen($frac));
            }
            $num = $int . '.' . $frac;
        }
    } else {
        // 不限制小數位,僅移除尾隨零
        if (strpos($num, '.') !== false) {
            $num = rtrim($num, '0');
            if (substr($num, -1) === '.') $num .= '0';
        }
    }
    return $num;
}

// 測試
echo formatFloat('1001.334534', 2) . "\n";  // 1001.33
echo formatFloat('-1001.000', 2) . "\n";    // -1001.00
echo formatFloat('1001.3', 5) . "\n";       // 1001.30000
echo formatFloat('1001.33') . "\n";         // 1001.33
echo formatFloat('1001.000') . "\n";        // 1001

資料庫層面優化

  1. 使用 DECIMAL 代替 FLOAT:DECIMAL(10,2) 精確儲存兩位小數,避免二進制浮點誤差。
  2. 查詢時格式化:SELECT FORMAT(price, 2) AS price_fmt FROM products(MySQL 內建格式化,含千分位逗號)。
  3. 應用層統一處理:建立 Model 存取器(Accessor)自動格式化輸出。

Yii 2 / Laravel 框架整合範例

// Yii 2 ActiveRecord
class Product extends \yii\db\ActiveRecord {
    public function getPriceFormatted() {
        return formatFloat($this->price, 2);
    }
}

// Laravel Eloquent
class Product extends Model {
    protected $casts = ['price' => 'decimal:2'];
    public function getPriceFormattedAttribute() {
        return formatFloat($this->price, 2);
    }
}

總結建議

  • 儲存層:優先 DECIMAL,避免 FLOAT/DOUBLE
  • 傳輸層:API 回傳字串格式化數值,避免前端 JS 浮點運算誤差
  • 顯示層:統一使用 formatFloat() 或框架內建格式化
  • 計算層:金額運算使用整數(分為單位)或 BCMath 任意精度庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved