继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

整数按位整除并保留小数点后固定位数

潇湘沐
关注TA
已关注
手记 104
粉丝 12
获赞 38

先看看需求环境:比较大的数字按位整除,比如按千位或万位整除,并保留小数点后多少多少位,比如一位,两位这样。

这样的变态需求基本上属于高精度计算了,我们常用的主类型加上运算符不太好算,那么我们可以考虑使用一些特殊的类型,比如封装器

涉及计算的封装器可参考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>

 

原文链接:http://www.apkbus.com/blog-35555-60422.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP