Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1040586
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1701
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-24 10:06
文章分类
文章存档

2014年(19)

2013年(27)

分类: Java

2014-03-25 15:12:44

工作中经常用到浮点数的四舍五入,但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;

   }


   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
阅读(3171) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

CU博客助理2014-06-12 10:30:11

专家点评:利用已有的jdk函数展开应用是软件设计和编码的一种方法。本文的只是对浮点数四舍五入进行了实验性应用,处理上是没有问题,这是个好的开端。但以下需要注意:1:通用性较差,2:没有例外的捕获,3:因为和round没有重写、继承等的关系,函数名用round不妥。总之、用心解决问题了。