背景
昨天,關於價格詳情接口又來了一個小需求,而且有點特別。價格顯示:改為保留兩位小數,沒錯,就是保留兩位小數。大家是不是想說這沒啥特別的。。。數據庫都有函數搞定了。例如四舍五入的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
總結
作為程序員,一定要有善於思考,善於總結的能力和習慣,每次解決一個問題,我們要判斷這能否做成一個通用的組件或者工具類,方便以后有此需求的小伙伴!