Java 四舍五入


一、几种四舍五入的方法

public static class Test {

      public static void main(String[] args) {

       

        String str = "111.675";

       

        //方法1:DecimalFormat

        DecimalFormat df = new DecimalFormat("#.00");

        try {

           Number n = df.parse(str);

           Double d = n.doubleValue();

           System.out.println("" + d);

        } catch (ParseException e1) {

           // TODO Auto-generated catch block

           e1.printStackTrace();

        }      

        String aString = df.format(Double.parseDouble(str));

        System.out.println(aString);

       

        //方法2:NumberFormat

        NumberFormat nf = NumberFormat.getInstance();

        nf.setMaximumFractionDigits(2);

        try {

           Number n = nf.parse(str);

           double d = n.doubleValue();

           System.out.println("" + d);

        } catch (ParseException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

        }      

        System.out.println(nf.format(Double.parseDouble(str)));

       

        //方法三:算术

        double d = ((double)Math.round(Double.parseDouble(str) * 100)) / 100;

        System.out.println("" + d);

       

        BigDecimal bd = new BigDecimal(str).setScale(2, RoundingMode.HALF_UP);

        double dd = bd.doubleValue();

        System.out.println(bd.toString());

        System.out.println("" + dd);

      }

   }

结果如下:

111.675

111.68

111.675

111.68

111.68

111.68

111.68

通过结果可以看到,DecimalFormat和NumberFormat在将String转换成数字的过程中,没有进行四舍五入;在调用format的时候,才根据设置进行了四舍五入的转换。

这两个类即使使用setRoundingMode也是相同的结果。而使用BigDecimal转换时,可以在String转换成数字的过程中,进行四舍五入。

二、RoundingMode(从另一博客中直接截取)

  ROUND_CEILING:   舍位时往正无穷方向移动   1.1->2   1.5->2   1.8->2   -1.1->-1   -1.5->-1   -1.8->-1   
  ROUND_DOWN:向0的方向移动1.1->1   1.5->1   1.8->1   -1.1->-1   -1.5->-1   -1.8>-1   
  ROUND_FLOOR:与CEILING相反,往负无穷   1.1->1   1.5->1   1.8->1   -1.1->-2   -1.5->-2   -1.8->-2   
  ROUND_HALF_DOWN:以5为分界线,或曰五舍六入1.5->1   1.6->1   -1.5->-1   -1.6->-2 1.15->1.1   1.16->1.2 1.55->1.6  1.56->1.6
  ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数1.15->1.2   1.16->1.2   1.25->1.2   1.26->1.3   
  ROUND_HALF_UP:最常见的四舍五入   
  ROUND_UNNECESSARY:无需舍位   
  ROUND_UP:与ROUND_DOWN,远离0的方向1.1->2   1.5->2   1.8->2   -1.1->-2   -1.5->-2   -1.8->-2   

摘录自:

  BigDecimal 的roundMode 舍位模式

  IEEE的舍入规则

  

原文地址:https://www.cnblogs.com/huanyou/p/6265864.html