- 需求描述
自定义修约要求 “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 :
git@github.com:liuyun888/tools.git