Java保留小数的方法

Java保留小数位数的方法

1.常用方法

这个问题很常见,也很容易解决,常用的方法有如下几种:

  • BigDecimal
  • DecimalFormat
  • java.util.Formatter
  • String.format
  • NumberFormat

1、BigDecimal 

先将double/float类型的数据转换为BigDecimal类型,然后再使用BigDecimal类的setScale方法,设置四舍五入以及保留的小数位数

public void testDouble()
{
    double num = 3.555555f;
    BigDecimal bd = new BigDecimal(num);
    bd = bd.setScale(4, RoundingMode.HALF_UP);
    // .getClass()获得变量的类型
    System.out.println(bd.getClass());
    System.out.println(bd);
    // 上面转换之后的bd为BigDecimal类型的数据,如果想转换为double,需要使用下面的转换方式。
    //.doubleValue将数字转换为double,Double.parseDouble()将字符串转换为double
    num = bd.doubleValue();
}


//输出结果为:
//  class java.math.BigDecimal
//  3.5556
  • ROUND_UP
    只要保留位数之后有一位为0就进位,且与正负无关
public class Demo 
{
    public static void main(String[] args) 
    {
        BigDecimal a = new BigDecimal(3.6666666666);
        BigDecimal b = new BigDecimal(-3.650000001);
        System.out.println(a.setScale(2,BigDecimal.ROUND_UP));
        System.out.println(b.setScale(2,BigDecimal.ROUND_UP));
    }
}

//输出结果
// 3.660000001——>3.67
// 3.666666666——>3.67
// -3.65000001——>-3.66
// -3.65000000——>3.65

  • ROUND_DOWN
    向下保留,不管保留位数后面是多少,统统舍去
    public class Demo 
    {
        public static void main(String[] args) 
        {
            BigDecimal a = new BigDecimal(3.66666666);
            BigDecimal b = new BigDecimal(-3.66666666);
            System.out.println(a.setScale(2,BigDecimal.ROUND_DOWN));
            System.out.println(b.setScale(2,BigDecimal.ROUND_DOWN));
        }
    }
    
    //输出结果为:
    //  3.66
    //  -3.66
    

  • ROUND_CEILING 向正无穷方向舍入
    public class Demo 
    {
        public static void main(String[] args) 
        {
            BigDecimal a = new BigDecimal(3.66666666);
            BigDecimal b = new BigDecimal(-3.66666666);
            System.out.println(a.setScale(2,BigDecimal.ROUND_CEILING));
            System.out.println(b.setScale(2,BigDecimal.ROUND_CEILING));
        }
    }
    
    //输出结果为:
    //  3.67
    //  -3.66
    
  • ROUND_FLOOR 向负无穷方向舍入
public class Demo 
{
    public static void main(String[] args) 
    {
        BigDecimal a = new BigDecimal(3.66666666);
        BigDecimal b = new BigDecimal(-3.66666666);
        System.out.println(a.setScale(2,BigDecimal.ROUND_FLOOR));
        System.out.println(b.setScale(2,BigDecimal.ROUND_FLOOR));
    }
}

//输出结果为:
//  3.66
//  -3.67
  • ROUND_HELF_UP:数字保留法(四舍五入)
public class Demo 
{
    public static void main(String[] args) 
    {
        BigDecimal a = new BigDecimal(3.66666666);
        BigDecimal b = new BigDecimal(-3.66666666);
        System.out.println(a.setScale(2,BigDecimal.ROUND_HALF_DOWN));
        System.out.println(b.setScale(2,BigDecimal.ROUND_HALF_DOWN));
    }
}

//输出结果为:
//  3.67
//  -3.67

2、DecimalFormat

DecimalFormat是一种数据格式化方式,首先实例化一个数据格式化方式df,并且指定保留两位小数,然后指定四舍五入的规则,然后使用df.format()即可完成格式化,值得注意的是,df.format()之后得到的结果是String类型的数据。

public void Demo()
{
	double num = 3.555555f;
    DecimalFormat df = new DecimalFormat("0.00");
    df.setRoundingMode(RoundingMode.HALF_UP);
    System.out.println(df.format(num).getClass());
    System.out.println(df.format(num));
    // Double.parseDouble将String类型的数据转换为Double类型
    num = Double.parseDouble(df.format(num));
}

//输出结果为:
//  class java.lang.String
//  3.56

.00 表示两位小数 #.0000四位小数 以此类推... 

public class Demo 
{
    public static void main(String[] args) 
    {
        double decimal=2.15545422;
        DecimalFormat df=new DecimalFormat("#.0000");
        String format = df.format(decimal);
        double v = Double.parseDouble(format);
        System.out.println(v);
    }
}

3、java.util.Formatter

java.util.Formatter方法最为简单,首先实例化一个Formatter对象,指定格式化的类型和数据,然后获得一个Formatter对象,再将这个对象转换为String,再转换为Double。

public void testFormatter()
{
    Formatter format = new Formatter().format("%.2f", num);
    // String.valueOf()和.toString方法都能转换为String,不过String.valueOf()更常用
    num = Double.parseDouble(String.valueOf(format));
}

%.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型

4、String.format

这种方法也非常简单,使用String.format()方法将double类型的数据转换为String类型的数据,然后再根据需要变换即可。

public void testStringFormat()
{
    String format = String.format("%.2f", num);
    System.out.println(format.getClass());
    System.out.println(Double.parseDouble(format));

    Double d = Double.parseDouble(String.format("%.2f",Math.sin(Math.PI/6)));
    System.out.println(d);

}

5、NumberFormat

public class DecimalFormatDemo 
{
    public static void main(String[] args) 
    {
        double decimal=2.15555422;

        /*
        DecimalFormat df=new DecimalFormat("#.0000");
        String format = df.format(decimal);
        double v = Double.parseDouble(format);
        System.out.println(v);
        */

        /*
        String format = String.format("%.3f", decimal);
        double v = Double.parseDouble(format);
        System.out.println(v);
        */

        // NumberFormat ddf1=NumberFormat.getNumberInstance() ;
        // void setMaximumFractionDigits(int digits) 
        // digits 显示的数字位数 为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的
        NumberFormat nf=NumberFormat.getNumberInstance();
        nf.setMaximumFractionDigits(3);
        String format = nf.format(decimal);
        double v = Double.parseDouble(format);
        System.out.println(v);

    }
}

你可能感兴趣的:(JAVA,java,开发语言)