mysql函数保留小数_MySql自定义函数-关于保留小数位的特殊需求
背景
昨天,關于價格詳情接口又來了一個小需求,而且有點特別。價格顯示:改為保留兩位小數,沒錯,就是保留兩位小數。大家是不是想說這沒啥特別的。。。數據庫都有函數搞定了。例如四舍五入的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
總結
作為程序員,一定要有善于思考,善于總結的能力和習慣,每次解決一個問題,我們要判斷這能否做成一個通用的組件或者工具類,方便以后有此需求的小伙伴!
總結
以上是生活随笔為你收集整理的mysql函数保留小数_MySql自定义函数-关于保留小数位的特殊需求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三国群英传6秘籍
- 下一篇: python 进程池_python进程池