背景 昨天,關於價格詳情介面又來了一個小需求,而且有點特別。價格顯示:改為保留兩位小數,沒錯,就是保留兩位小數。大家是不是想說這沒啥特別的。。。資料庫都有函數搞定了。例如四捨五入的ROUND(x,d),直接截取的TRUNCATE(x,d),還可以利用類型轉換CONVERT(value,type)等等 ...
背景
昨天,關於價格詳情介面又來了一個小需求,而且有點特別。價格顯示:改為保留兩位小數,沒錯,就是保留兩位小數。大家是不是想說這沒啥特別的。。。資料庫都有函數搞定了。例如四捨五入的ROUND(x,d),直接截取的TRUNCATE(x,d),還可以利用類型轉換CONVERT(value,type)等等。但是,上面的都不能滿足這個保留兩位的特殊需求,我們來看一下究竟怎麼保留兩位:小數點兩位後,只要大於0的,就直接進一。例如:1.8100 -> 1.81,1.8102 -> 1.82
分析
那麼,這需要怎麼解決呢,資料庫好像確實沒函數來這麼弄了,那麼只能在sql里判斷,或者java里判斷了。因為這要快速搞定,就直接在sql里入手了。其實也很簡單:如果原數比直接截取兩位後的數大,表示兩位後還有數,然後就直接+0.01。
sql這麼改:
if(price > TRUNCATE(price,2),TRUNCATE(price,2)+0.01,TRUNCATE(price,2)) AS elecPrice
優化-編寫自定義函數
回頭一想,sql好像寫得有點僵硬,如果有多個欄位需要這樣顯示,那豈不是每個都要寫這麼長一串。又如果不是保留兩位,而是保留三位,那麼豈不是之前的sql又得全部改一遍。。這麼一想,我突然就很頭疼。程式員嘛,還是得有點追求,不能只為解決問題,一定要自己思考一種比較好的方案:通用的,簡潔的。最後,自己編寫了一個通用的函數,可以自定義位數,然後返回處理後的數字。關於MySql如何編寫自定義函數,大家可以自己百度一下,下麵直接上函數:
drop FUNCTION if exists ENTER_ONE;
create function ENTER_ONE(origin decimal(5,4),digit INT) returns decimal(3,2)
begin
DECLARE result FLOAT;
IF origin > TRUNCATE(origin,digit) THEN
set result = TRUNCATE(origin,digit)+1/POWER(10,digit);
ELSE
set result = TRUNCATE(origin,digit);
END IF;
return result;
end;
下麵簡單解釋一下:
首先,調用此函數得傳入兩個參數,第一個是要處理的浮點數origin,第二個是要保留的位數digit。
然後,定義好結果result後,開始進行邏輯判斷。當然了,還是上面的配方,原數和直接截取digit位後的數進行比較,如果大:則直接截取digit為後的數加上1除去10的digit次方。否則,直接截取digit為數。
最後返回結果result即可。
sql就變得想當簡單了:
ENTER_ONE(price,2) as elecPrice
總結
作為程式員,一定要有善於思考,善於總結的能力和習慣,每次解決一個問題,我們要判斷這能否做成一個通用的組件或者工具類,方便以後有此需求的小伙伴!