天天看點

四舍六入五成雙

  1. 需求描述

    自定義修約要求 “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位。

  2. 算法解釋

    四舍六入五成雙的規則:

    a.被修約的數字小于5時,該數字舍去;

    b.被修約的數字大于5時,則進位;

    c.被修約的數字等于5時,要看5前面的數字,若是奇數則進位,若是偶數則将5舍掉,即修約後末尾數字都成為偶數;若5的後面還有不為“0”的任何數,則此時無論5的前面是奇數還是偶數,均應進位。

  3. 使用到的計算

    (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