背景
昨天,關于價格詳情介面又來了一個小需求,而且有點特別,價格顯示:改為保留兩位小數,沒錯,就是保留兩位小數,大家是不是想說這沒啥特別的,,,資料庫都有函式搞定了,例如四舍五入的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
總結
作為程式員,一定要有善于思考,善于總結的能力和習慣,每次解決一個問題,我們要判斷這能否做成一個通用的組件或者工具類,方便以后有此需求的小伙伴!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/124337.html
標籤:MySQL
