虽然利用java.math.BigDecimal可以进行小数的四舍五入,但是不能保留相应的位数,如下:</span>
<span style="white-space:pre"> </span>System.out.println(
Float.parseFloat(new BigDecimal("12.2355").setScale(3, BigDecimal.ROUND_HALF_UP).toString()));
System.out.println(
Float.parseFloat(new BigDecimal("12.2398").setScale(3, BigDecimal.ROUND_HALF_UP).toString()));
System.out.println(
Float.parseFloat(new BigDecimal("12.23").setScale(3, BigDecimal.ROUND_HALF_UP).toString()));
System.out.println(
Float.parseFloat(new BigDecimal("12.235").setScale(3, BigDecimal.ROUND_HALF_UP).toString()));
输出结果为:</span>
12.236
12.24
12.23
12.235
于是,自己写了一个类,对小数四舍五入时,还可以保留相应位数。
import java.math.BigDecimal;
public class RoundTool {
public static String round(double num,int dotNum){
//num为要进行四舍五入的数,dotNum为保留的小数位数
String numValue=String.valueOf(num);
int dot=numValue.indexOf(".");
int dotLength=numValue.length()-1-dot;
//num的小数位数大于dotNum
if(dotLength>dotNum){
//valueIn为要考虑的进位数
String valueIn=numValue.substring(dot+dotNum+1, dot+dotNum+2);
//value为进位数之前的数
String value=numValue.substring(0, dot+dotNum+1);
double initValue=Double.valueOf(value);
int numIn=Integer.valueOf(valueIn);
//进位数大于等于五,就要向前进位
if(numIn>=5){
StringBuilder inString=new StringBuilder();
inString.append("0.");
int i=dotNum-1;
while(i>0){
inString.append("0");
i--;
}
inString.append("1");
//算出要加的数0.00***01
double doubleIn=Double.valueOf(inString.toString());
BigDecimal x=new BigDecimal(value);
BigDecimal y=new BigDecimal(inString.toString());
BigDecimal z=x.add(y); //两数相加
String endsString=z.toString();
//以下是考虑进位后是否还有向前进位
int dotpos=endsString.indexOf(".");
int dotposLength=endsString.length()-1-dotpos;
//如果向前进位后小数位数小于dotNum,则补零
if(dotposLength<dotNum){
int j=dotNum-dotposLength;
while(j>0){
endsString+="0";
j--;
}
}
return endsString;
}else{ //进位数小于五,不进位
return value;
}
}else if(dotLength==dotNum){ //num的小数位数等于dotNum
return numValue;
}else{ //num的小数位数小于dotNum,则补零
int z=dotNum-dotLength;
while(z>0){
numValue+="0";
z--;
}
}
return numValue;
}
public static void main(String[] args) {
//测试
System.out.println(round(12.2355, 3));
System.out.println(round(12.2398, 3));
System.out.println(round(12.23, 3));
System.out.println(round(12.235, 3));
}
}
测试结果:
12.236
12.240
12.230
12.235