保留两位小数四种方法:String.format(),BigDecimal.setScale(),NumberFormat.format(),DecimalFormat.format()详解

废话不多说,直接上代码,注释比较详细,比较多,没有时间仔细看的可以直接看代码。


package test;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

public class 保留两位小数四种方法 {

    public static void main(String args[]) {
        double x = 123.456789;

        /*
         * 方法一:String 最容易想到,简单强大
         * 
         * String.format()用法
         * 
         * 1、转换符 
         * %s: 字符串类型,如:"ljq" 
         * %b: 布尔类型,如:true 
         * %d: 整数类型(十进制),如:99 
         * %f:浮点类型,如:99.99 
         * %%: 百分比类型,如:% 
         * %n: 换行符
         * 
         * 2、常见日期时间格式化 
         * c: 包括全部日期和时间信息 星期六 十月 27 14:21:20 CST 2007 
         * F:"年-月-日"格式,如:2007-10-27 
         * D: "月/日/年"格式,如:10/27/07 
         * r: "HH:MM:SS PM"格式(12时制),如:02:25:51 下午
         * T: "HH:MM:SS"格式(24时制),如:14:28:16
         * R: "HH:MM"格式(24时制),如:14:28
         * 
         * 3、格式化日期字符串 
         * b或者h: 月份简称,如: 中:十月  英:Oct
         * B: 月份全称,如: 中:十月  英:October
         * a: 星期的简称,如 :中:星期六  英:Sat
         * A: 星期的全称,如: 中:星期六  英:Saturday
         * C: 年的前两位数字(不足两位前面补0),如:20 
         * y: 年的后两位数字(不足两位前面补0),如:07 
         * Y:4位数字的年份(不足4位前面补0),如:2007 
         * j: 一年中的天数(即年的第几天),如:300 
         * m:两位数字的月份(不足两位前面补0),如:10 
         * d: 两位数字的日(不足两位前面补0),如:27 
         * e: 月份的日(前面不补0),如:5
         * 
         * 4、格式化时间字符串
         *  H: 2位数字24时制的小时(不足2位前面补0),如:15 
         *  I:2位数字12时制的小时(不足2位前面补0),如:03 
         *  k: 2位数字24时制的小时(前面不补0),如:15 
         *  l:2位数字12时制的小时(前面不补0),如:3 
         *  M: 2位数字的分钟(不足2位前面补0),如:03 
         *  S:2位数字的秒(不足2位前面补0),如:09 
         *  L: 3位数字的毫秒(不足3位前面补0),如:015 
         *  N:9位数字的毫秒数(不足9位前面补0),如:562000000
         *  p: 小写字母的上午或下午标记,如: 中:下午  英:pm
         *  z: 相对于GMT的RFC822时区的偏移量,如:+0800 
         *  Z: 时区缩写字符串,如:CST 
         *  s: 1970-1-1 00:00:00  到现在所经过的秒数,如:1193468128 
         *  Q: 1970-1-1 00:00:00   到现在所经过的毫秒数,如:1193468128984
         */

         String temp1 = String.format("%.2f", x);
         double result1 = Double.parseDouble(temp1);
         System.out.println(result1);

        /*
         * 方法二:BigDecimal
         * 
         * 核心方法详解:
         * BigDecimal.setScale()方法用于格式化小数点 setScale(1)表示保留一位小数,默认用四舍五入方式
         * setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
         * setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
         * setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
         * setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
         */

        BigDecimal mBigDecimal = new BigDecimal(x);
        BigDecimal result2 = mBigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(result2);

        /*
         * 方法三:NumberFormat NumberFormat 表示数字的格式化类,可以按照本地的风格习惯进行数字的显示
         * MessageFormat 、DateFormat 、NumberFormat 是 Format 三个常用的子类
         * 
         * 获取该实例的几个方法 getInstance(),返回当前缺省语言环境的缺省数值格式。
         * getCurrencyInstance()返回当前缺省语言环境的通用格式 getNumberInstance()
         * 返回当前缺省语言环境的通用数值格式 getPercentInstance() 返回当前缺省语言环境的百分比格式
         * 
         * setMaximumFractionDigits(int) 设置数值的小数部分允许的最大位数。
         * setMaximumIntegerDigits(int) 设置数值的整数部分允许的最大位数。
         * setMinimumFractionDigits(int) 设置数值的小数部分允许的最小位数。
         * setMinimumIntegerDigits(int) 设置数值的整数部分允许的最小位数.
         */

          NumberFormat mNumberFormat = NumberFormat.getInstance();
          mNumberFormat.setMaximumFractionDigits(2);
          String temp2 = mNumberFormat.format(x);
          double result3 = Double.parseDouble(temp2);
          System.out.println(result3);

        /*
         * 方法四:DecimalFormat
         * DecimalFormat 是 NumberFormat 的一个具体子类,比NumberFormat更灵活,用于格式化十进制数字
         * 
         * DecimalFormat 包含一个模式 和一组符号 符号含义:
         * 0 一个数字 
         * # 一个数字不包括 0 
         * . 小数的分隔符的占位符 
         * , 分组分隔符的占位符 
         * ;分隔格式。
         * - 缺省负数前缀。
         * % 乘以 100 和作为百分比显示 
         * ? 乘以 1000和作为千进制货币符显示;用货币符号代替;如果双写,用 国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 替十进制分隔符。
         *  X前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。
         */

        DecimalFormat mDecimalFormat = new DecimalFormat("0.00");
        String temp3 = mDecimalFormat.format(x);
        double result4 = Double.parseDouble(temp3);
        System.out.println(result4);


        /*
         * 最后的补充:
         * 如果只是打印出来,不用保存到变量中,可用System.out.printf(String format, Object args)方法
         * 
         * "%"表示进行格式化输出,"%"之后的内容为格式的定义
         * "f"表示格式化输出浮点数
         * +"表示输出的数带正负号
         * "-"表示输出的数左对齐(默认为右对齐)
         * "+-"表示输出的数带正负号且左对齐
         * "d"表示输出十进制整数
         * "o"表示输出八进制整数
         * "x"表示输出十六进制整数
         * "#x"表示输出带有十六进制标志的整数
         * "#o"表示输出带有八进制标志的整数
         * "s"表示输出字符串
         */

        int d = 654321;
        double f = 12345.6789;
        String str = "hello world!";

        System.out.printf("%f", f);
        System.out.println();

        // "9.2"中的9表示输出的长度,2表示小数点后的位数。
        System.out.printf("%9.2f", f);
        System.out.println();

        System.out.printf("%+9.2f", f);
        System.out.println();
        System.out.printf("%-9.4f", f);
        System.out.println();
        System.out.printf("%+-9.3f", f);
        System.out.println();
        System.out.printf("%d", d);
        System.out.println();
        System.out.printf("%o", d);
        System.out.println();
        System.out.printf("%x", d);
        System.out.println();
        System.out.printf("%#x", d);
        System.out.println();
        System.out.printf("%#o", d);
        System.out.println();
        System.out.printf("%s", str);
        System.out.println();

        // 可以输出多个变量,注意顺序。
        System.out.printf("输出一个浮点数:%f,一个整数:%d,一个字符串:%s", f, d, str);
        System.out.println();

        // "X$"表示第几个变量。
        System.out.printf("字符串:%2$s,%1$d的十六进制数:%1$#x", d, str);
    }

}

你可能感兴趣的:(java)