MySQL小記——數據格式化

  記錄下今天在項目中出現的一個小問題。spring

  將經過除運算得到的結果數據進行保留兩位小數的處理時,我用了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() 來獲取數據的,因此會出現類型轉換錯誤。jsp

  個人解決方法是將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。對象

相關文章
相關標籤/搜索