工作中经常用到浮点数的四舍五入,但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 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 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 for(int i=pos+dotLen+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; } 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
public static void main(String[] args){