四舍六入五成双

  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

你可能感兴趣的:(工具箱,四舍六入五成双,有效位数,Math)