很早以前就比较疑惑Java怎么保留小数点后两位(或者后n位),看了CSDN很多篇博客越看越头疼。为啥那么多方法到最后都是字符串累心呢?我只需要保留小数点后几位,没让你给我转成字符串呀。按照那些方法,最后还是要用Double.parseDouble(arg0);这个方法转成double。既然如此,那我为啥不用字符串截取呢?这样写起来还没那么复杂。下面是字符串截取的思路:
public double saveNumAfterPoint(double oldDouble,int num) {
//double oldDouble 原浮点数,int num 需要保留小数点后几位
String temp = oldDouble+"";
double newDouble = .0D;
temp = temp.substring(0,temp.indexOf('.')+num+1);
try {
newDouble = Double.parseDouble(temp);
} catch (NumberFormatException e) {
e.printStackTrace();
}
return newDouble;
}
说实话,我个人觉得这种字符串截取的,实在是太lowB了,性能什么的都不说了,就这写起来都这么长一串。因此就产生了一个重新写一个更简单点的方法,说干就干,下午上班无聊正好就写了一个出来。不过这个方法存在一个问题就是最多保留小数点后19位,因为long类型的取值范围(-9223372036854774808~9223372036854774807)就限制了被除数的大小。不过,对于大部分需要取小数点后几位的应用场景来说,只需要保留后2位左右。下面是我用字符串截取的思路的另外一种方法:
public double saveNumAfterPoint(double oldDouble,int deleverLength) {
//double oldDouble 原浮点数,int deleverLength 需要保留小数点后几位
double newDouble = .0D;
long deliverNum = (long)Math.pow(10, deleverLength);
newDouble = ((long)(oldDouble*deliverNum)*1.0)/deliverNum;
return newDouble;
}
为了方便理解这里的第二种方法整成函数了,但是可以精简成一行代码,这里偷个懒,需要的童鞋自己改吧!哈哈哈