從 Excel 匯出 CSV 時,數字欄位常被轉成指數格式,例如 0.000089 變成 8.90E-05。直接塞進 MySQL 沒問題,但用 bcmul 運算就會噴 bcmul(): bcmath function argument is not well-formed。
用 sprintf 轉回小數
最直覺的做法是用 sprintf 把指數轉回 float:
| |
但小數點位數超過 6 位時就會出問題:
| |
%f 預設只保留 6 位小數,超過的部分直接被截掉了。
動態計算小數位數
從指數的 E- 後面取出位數,動態調整 sprintf 的精度:
| |
這樣不管小數點位數多長都能正確轉換。
參考資源
- PHP 官方文件:sprintf — sprintf 格式說明與精度控制
- PHP 官方文件:bcmath 函式庫 — 任意精度數學運算函式
- PHP 官方文件:preg_match — 正規表達式比對函式
