記錄下今天在項目中出現的一個小問題。
將通過除運算獲得的結果數據進行保留兩位小數的處理時,我用了MySQL 的 FORMAT(X, D)函數,之前一直沒有出現問題,但是由於周期性更新的數據庫中突然出現了一個絕對值很大的負數(如下異常中的-58535.53),用基於spring 的 Java 代碼將查詢結果展示在jsp頁面時發生如下異常:
很明顯是因為數據格式轉換的問題,仔細看發現小數點向前3位處使用了逗號進行了分割。之前一直以為 FORMAT(X, D) 函數只是用來處理小數位取舍的,由於在絕對值較小的時候不會出現逗號進行分割,所以並沒有去深究其用法。今天突然出現的問題讓我有點兒懵,在Navicat客戶端查詢也顯示有逗號分割,思前想后卻始終沒想到這個函數其實是格式化函數,最終還是請教項目組長幫我看出來的,他直接來一句“你把它格式化干嘛!”。一語驚醒夢中人,遂立刻百度,發現FORMAT(X, D) 其實是按 ' #,###,###.## ' 這樣的格式對數據進行格式化的函數,函數參數 X 就是要格式化的數據,D 表示經過四舍五入后小數點后保留幾位;如果數值的整數部分超過3位,則會從小數點往前每3位以逗號進行分割,而且數值本身也會被格式化為字符串類型。所以,在我的程序中,參數D的值為2,所以才會得到 -58,535.53 的結果,而在程序中我是通過結果集對象rs.getDouble() 來獲取數據的,所以會出現類型轉換錯誤。
我的解決方法是將FORMAT(X,D) 函數替換為 ROUND(X, D),二者在數值處理上是一樣的,即都會按照“四舍五入”對小數位進行處理,但ROUND不會將數值的整數部分格式化為固定類型的字符串,而是保留純數值形式。
此外,在小數位處理上,除了FORMAT(X, D) 和 ROUND(X, D) 外,與它們相近的還有TRUNCATE(X, D) 函數,只是該函數會直接按指定的 D 對數值進行截取,而不會進行“四舍五入”處理。例如,TRUNCATE(30.8923, 1) 的結果為30.8,而不是30.9。