工作中經常用到浮點數的四捨五入,但Java類庫中的Math類的rint()和round()兩個方法並不能滿足我們的所有需要,下面我們就自定義四捨五入類來滿足實際工作中的需要。
public class RoundTool {
/**
* 浮點數的四捨五入
* @param value
* @param dotNum
* @return
*/
public static String round(double value,int dotNum){
String strValue=String.valueOf(value);//轉換為字符串
int pos=strValue.indexOf(".");//小數點位置
int len=strValue.length();//數值總位數
int dotLen=len-1-pos;//小數的位數
double endValue=0.0;//保存運算結果的中間變量
String endNum="";//保存最終結果的變量
if(dotNum<dotLen){//需要保留的小數位數小於實現小數位數
String cNum=strValue.substring(pos+dotNum+1,pos+dotNum+2);//獲得需要進位
int iNum=Integer.valueOf(cNum);//轉換不整數
String sNum=strValue.substring(0,pos+dotNum+1);//獲得需要保留的未進行捨入處理的數值
endValue=Double.valueOf(sNum);//轉換為double型
if(iNum>=5){//如果需要捨入的值大於等於5
String endPos="";//存放需要進位的小數值
String dotValue="";//連接小數點後的多個0
for(int i=1;i<dotNum;i++){
dotValue=dotValue+"0";//將小數點後的多個0連接到一起
}
endPos="0."+dotValue+"1";//需要進位的小數值
endValue=endValue+Double.valueOf(endPos);//四捨五入處理之後的值
strValue=String.valueOf(endValue);//處理後的值轉換為字符串
pos=strValue.indexOf(".");//小數點後的位置
len=strValue.length();//數值總位數
dotLen=len-1-pos;//小數的位數
if(dotLen<dotNum){//如果小數位數不足,則補足位數
for(int i=pos+dotLen+1;i<pos+dotNum+1;i++){
endNum=String.valueOf(endValue)+"0";//補足小數位數
}
}else{//如果小數位數正好,或超過要求,則進行截位處理
endNum=String.valueOf(endValue).substring(0,pos+dotNum+1);
}
}else{
;
endNum=strValue.substring(0,strValue.indexOf("."))+
strValue.substring(strValue.indexOf("."),strValue.indexOf(".")+dotNum+1);
}
}else if(dotNum==dotLen){
endNum=String.valueOf(value);//小數位數與要求的位數相同,直接轉換為字符串
}else{//如果小數位數不足,則補足位數
for(int i=1;i<=dotNum-dotLen;i++){
strValue=strValue+"0";//補足小數位數
}
endNum=strValue;//最終值
}
return endNum;
}
public static void main(String[] args){
System.out.println(RoundTool.round(123.121, 2));
System.out.println(RoundTool.round(123.456789,3));
System.out.println(RoundTool.round(123.5,3));
}
}
程序運行結果:
123.12
123.45
123.500