先看看需求环境:比较大的数字按位整除,比如按千位或万位整除,并保留小数点后多少多少位,比如一位,两位这样。
这样的变态需求基本上属于高精度计算了,我们常用的主类型加上运算符不太好算,那么我们可以考虑使用一些特殊的类型,比如封装器
涉及计算的封装器可参考BigInteger 、BigDecimal ,一个是支持整数,一个支持定点数字
要留下小数点,那就没法用Integer了。
我们的核心逻辑就是构造BigDecimal,用setScale方法来计算并向最接近的数字舍入
先记住三个参数及Java中BigDecimal的8种舍入模式
Java中BigDecimal的8种舍入模式参看这里http://www.bdqn.cn/news/201311/11834.shtml
我们使用ROUND_HALF_EVEN来取最接近的结果,这个参数见仁见智,看哪个更接近自己想要的结果
被除数num
除数max 进位数,如千进位或万进位
保留位数scale 如保留小数后1位
根据我们的需求整理一下实现:
[代码]java代码:
double tempResult = (double)num/max;//当两个整数相除时,由于小数点以后的数字会被截断,运算结果将为整数,因此使用double 精确转换
BigDecimal bigdecimal = new BigDecimal(Double.toString(tempResult ));//精确计算,用String来够造BigDecimal
Double resultScaled= bigdecimal .setScale(scale, BigDecimal.ROUND_HALF_EVEN).doubleValue();
String result;
if(resultScaled- Double.valueOf(resultScaled).intValue()== 0){//保留的小数为0则直接舍弃
result = String.valueOf(resultScaled.intValue());
}else{
result = resultScaled.toString();
}
return result;
<br>