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
DECIMAL(10,2) 精確儲存兩位小數,避免二進制浮點誤差。SELECT FORMAT(price, 2) AS price_fmt FROM products(MySQL 內建格式化,含千分位逗號)。// 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/DOUBLEformatFloat() 或框架內建格式化