-
需求描述
自定義修約要求 “request” 字段說明如下:
numberRange:數值範圍,其中 gt >, lt < , ge >=, le <=,eq =; V 為數字占位符
type:修約類型,其中 1:小數點,2:有效數字,3:科學計數法的有效數字
digit:位數,配合type
例如:
{“request”: [{“numberRange”: “Vgt0.1&&Vlt1000”,“type”: “2”,“digit”:“3”},{“numberRange”: “Vle0.1”,“type”: “1”,“digit”:“3”},{“numberRange”: “Vge1000”,“type”: “3”,“digit”:“2”}]}
表示:
當小于等于0.1時,保留小數點後三位;當大于0小于1000時,儲存有效數字三位;當大等于1000時,改為科學計數法,并保留有效位數2位。
-
算法解釋
四舍六入五成雙的規則:
a.被修約的數字小于5時,該數字舍去;
b.被修約的數字大于5時,則進位;
c.被修約的數字等于5時,要看5前面的數字,若是奇數則進位,若是偶數則将5舍掉,即修約後末尾數字都成為偶數;若5的後面還有不為“0”的任何數,則此時無論5的前面是奇數還是偶數,均應進位。
-
使用到的計算
(1)String類型數學表達式直接進行運算
例如将 “Vgt0.1&&Vlt1000” 替換為 “1925.236>0.1&&1925.236<1000”後,直接作為判斷條件;
java是無法解決,但是javaScript中有一個eval函數是可以執行的,是以,可以通過其他途徑。執行javaScript就可以做到,而ScriptEngine是java的一個javaScript實作類。
(2)數字的計算精度問題
Double與BigDecimal的精度是有差別的。
首先不可用 Bigdecimal bg = new BigDecimal(Double) 的方式進行類型轉化,而是用 BigDecimal.valueOf(Double)的方式。
其次BigDecimal提供加減乘除方法。
(3)Math方法
1. 基本數學知識
Math.ceil()用作向上取整。
math.ceil(8)=8
math.ceil(8.5) =9
math.ceil(-8) =-8
math.ceil(-8.5))= -8
Math.floor()用作向下取整。
Math.floor(0.60) = 0
Math.floor(0.40) = 0
Math.floor(5) = 5
Math.floor(5.1) = 5
Math.floor(-5.1) = -6
Math.floor(-5.9) = -6
Math.round() 我們數學中常用到的四舍五入取整。
math.round(-8.9) =-9
math.round(-8.1) =-8
math.round(8.9) =9
math.round(8.1) =8
Math.pow(底數,幾次方)
double a=2.0;
double b=3.0;
double c=Math.pow(a,b);
就是2的三次方是多少;
c最終為8;
Math.log10(double a) 傳回以10為底的double的值。
特殊情況:
如果參數是NaN或小于零,那麼結果是NaN.
如果參數是正無窮大,那麼結果為正無窮大.
如果參數是正零或負零,那麼結果是負無窮大.
如果參數是等于10N整數n,那麼結果是n.
對數
如果a的x次方等于N(a>0,且a不等于1),那麼數X叫做以a為底N的對數(logarithm),記作x=logaN
。其中,a叫做對數的底數,N叫做真數,x叫做“以a為底N的對數”
作者:linheimx
連結:https://www.jianshu.com/p/09ddca8b17ef
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
demo :
[email protected]:liuyun888/tools.git