数值格式化 NumberFormat DecimalFormat RoundingMode

Posted minisimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数值格式化 NumberFormat DecimalFormat RoundingMode相关的知识,希望对你有一定的参考价值。

NumberFormat
【简介】

java.text.NumberFormat   extends   java.text.Format    extends    java.lang.Object
实现的接口:Serializable, Cloneable
直接子类:ChoiceFormat, DecimalFormat

NumberFormat 是所有数值格式的抽象基类。此类提供格式化和解析数值的接口。NumberFormat 还提供了一些方法来确定哪些语言环境具有数值格式,以及它们的名称是什么。

NumberFormat 可用于格式化和解析任何语言环境的数值。使代码能够完全独立于小数点、千位分隔符甚至所用特定小数位数的语言环境约定,并与数值格式是否为偶小数无关。

若要格式化当前 Locale 的数值,可使用其中一个工厂类方法:

myString = NumberFormat.getInstance().format(myNumber);

若要格式化不同 Locale 的日期,可在对 getInstance 的调用中指定它。

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);

还可以使用 NumberFormat 来解析数值:

myNumber = nf.parse(myString);

使用 getInstance 或 getNumberInstance 来获取常规数值格式。使用 getIntegerInstance 来获取整数数值格式。使用 getCurrencyInstance 来获取货币数值格式。使用 getPercentInstance 来获取显示百分比的格式。使用此格式,小数 0.53 将显示为 53%。

使用 setMinimumFractionDigits 之类的方法还可以控制数值的显示。如果想对格式化和解析进行更多的控制(或者给予用户更多的控制),可以尝试将从工厂方法获取的 NumberFormat 强制转换为 DecimalFormat。这适用于大多数语言环境;只是要记住将其放入一个 try 代码块中,以防遇到特殊情况。

【API】
1、Object clone() 重写 Cloneable
2、boolean equals(Object obj) 重写 equals
3、int hashCode() 重写 hashCode
4、String format(double number) 格式规范。
5、abstract StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) 格式规范。
6、String format(long number) 格式规范。
7、abstract StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) 格式规范。
8、StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) 格式化一个数并将所得文本添加到给定字符串缓冲区。
10、Number parse(String source) 解析给定字符串开头的文本,生成一个数值。
11、abstract Number parse(String source, ParsePosition parsePosition) 如果可能则返回 Long (例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范围内且没有小数),否则返回 Double。
12、Object parseObject(String source, ParsePosition pos) 解析字符串中的文本,以生成一个 Number。
13、int getMaximumFractionDigits() 返回数的小数部分所允许的最大位数。
14、int getMaximumIntegerDigits() 返回数的整数部分所允许的最大位数。
15、int getMinimumFractionDigits() 返回数的小数部分所允许的最小位数。
16、int getMinimumIntegerDigits() 返回数的整数部分所允许的最小位数。
17、void setMaximumFractionDigits(int newValue) 设置数的小数部分所允许的最大位数。
18、void setMaximumIntegerDigits(int newValue) 设置数的整数部分所允许的最大位数。
19、void setMinimumFractionDigits(int newValue) 设置数的小数部分所允许的最小位数。
20、void setMinimumIntegerDigits(int newValue) 设置数的整数部分所允许的最小位数。
21、static Locale[] getAvailableLocales() 返回一个数组,它包含所有此类的 get*Instance 方法可以为其返回本地化实例的语言环境。
22、static NumberFormat getCurrencyInstance() 返回当前默认语言环境的【货币】格式。
23、static NumberFormat getCurrencyInstance(Locale inLocale) 返回指定语言环境的【货币】格式。
24、static NumberFormat getInstance() 返回当前默认语言环境的通用【数值】格式。
25、static NumberFormat getInstance(Locale inLocale) 返回指定语言环境的通用【数值】格式。
26、static NumberFormat getIntegerInstance() 返回当前默认语言环境的【整数】格式。
27、static NumberFormat getIntegerInstance(Locale inLocale) 返回指定语言环境的【整数】格式。
28、static NumberFormat getNumberInstance() 返回当前默认语言环境的【通用数值】格式。
29、static NumberFormat getNumberInstance(Locale inLocale) 返回指定语言环境的【通用数值】格式。
30、static NumberFormat getPercentInstance() 返回当前默认语言环境的【百分比】格式。
31、static NumberFormat getPercentInstance(Locale inLocale) 返回指定语言环境的【百分比】格式。
32、Currency getCurrency() 获取格式化货币值时此数值格式使用的货币。
33、RoundingMode getRoundingMode() 获取在此 NumberFormat 中使用的 RoundingMode。
34、boolean isGroupingUsed() 如果此格式中使用了分组,则返回 true。
35、boolean isParseIntegerOnly() 如果此格式只将数作为整数解析,则返回 true。
36、void setCurrency(Currency currency) 设置格式化货币值时此数值格式使用的货币。
37、void setRoundingMode(RoundingMode roundingMode) 设置在此 NumberFormat 中使用的 RoundingMode。
38、void setGroupingUsed(boolean newValue) 设置此格式中是否使用分组。
39、void setParseIntegerOnly(boolean value) 设置数是否应该仅作为整数进行解析。


【测试代码】

public class Test {
public static void main(String[] args) {
testGetInstance();
System.out.println("----------testSetDigits------------");
testSetDigits();
System.out.println("-----------testRoundingMode-----------");
testRoundingMode();
System.out.println("-----------testParse-----------");
testParse();
}

private static void testGetInstance() {
    double d = 23323.3323232323;
    System.out.println(NumberFormat.getInstance().format(d));//23,323.332。返回当前缺省语言环境的【缺省数值】格式
    System.out.println(NumberFormat.getCurrencyInstance().format(d));//¥23,323.33。返回当前缺省语言环境的【货币】格式
    System.out.println(NumberFormat.getNumberInstance().format(d));//23,323.332。返回当前缺省语言环境的【通用数值】格式
    System.out.println(NumberFormat.getIntegerInstance().format(d));//23,323。返回当前缺省语言环境的【整数】格式
    System.out.println(NumberFormat.getPercentInstance().format(d));//2,332,333%。返回当前缺省语言环境的【百分比】格式
}

private static void testSetDigits() {
    NumberFormat format = NumberFormat.getInstance();
    format.setParseIntegerOnly(true);//设置数是否应该仅作为整数进行解析。此方法只影响解析,与格式化无关
    format.setMinimumFractionDigits(2);//设置数值的【小数部分】允许的最小位数。这几个方法只影响格式化,与解析无关
    format.setMaximumFractionDigits(3);//设置数值的【小数部分】允许的最大位数
    format.setMinimumIntegerDigits(1);//设置数值的【整数部分】允许的最小位数
    format.setMaximumIntegerDigits(5);//设置数值的【整数部分】允许的最大位数

    System.out.println(format.format(123.1234));//123.123
    System.out.println(format.format(123.1000));//123.10
    System.out.println(format.format(123456789.12345));//56,789.123
}

private static void testRoundingMode() {
    NumberFormat format = NumberFormat.getInstance();
    format.setMaximumFractionDigits(0);//设置数值的【小数部分】允许的最大位数
    System.out.println("默认模式为:" + format.getRoundingMode().name());//HALF_EVEN
    System.out.println(format.format(5.6));//6。5以上不管是奇数还是偶数,5都舍入
    System.out.println(format.format(5.4));//5。5以下不管是奇数还是偶数,5都舍去
    System.out.println(format.format(1.5));//2。当是5时,若前一位是奇数,5就舍入
    System.out.println(format.format(2.5));//2。当是5时,若前一位是偶数,5就舍去
    
    format.setRoundingMode(RoundingMode.HALF_UP);//四舍五入。此方法只影响格式化,与解析无关
    System.out.println("当前模式为:" + format.getRoundingMode().name());//HALF_UP
    System.out.println(format.format(5.6));//6
    System.out.println(format.format(5.4));//5
    System.out.println(format.format(1.5));//2
    System.out.println(format.format(2.5));//3
}

private static void testParse() {
    NumberFormat format = NumberFormat.getInstance();
    format.setParseIntegerOnly(false);//设置数是否应该仅作为整数进行解析。此方法只影响解析,与格式化无关
    format.setMinimumFractionDigits(2);//这几个方法只影响格式化,与解析无关
    ParsePosition position = new ParsePosition(2);

    try {
        Number number = format.parse("00123.10050100结尾处不受影响");//如果无法解析字符串的【开头】则抛出ParseException
        Number number2 = format.parse("开头00123.10050100结尾处不受影响", position);//解析字符串时,从position.getIndex()处开始解析

        System.out.println(number.floatValue());//123.1005
        System.out.println(number.intValue());//123
        System.out.println(number2.doubleValue());//123.100501
        System.out.println(position.getIndex());//16。解析前,代表解析开始处字符的索引;解析后,代表被解析的最后一个字符后的字符的索引
        System.out.println(position.getErrorIndex());//-1。获取出错时的索引,如果没有设置错误索引,则为 -1

        position.setIndex(1);//如果重用ParsePosition,须重新设置一下Index才可以
        System.out.println(format.parse("12.345678只解析", position).floatValue());//2.345678
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

}

DecimalFormat 重要

java.text.DecimalFormat extends java.text.NumberFormat extends java.text.Format extends java.lang.Object
实现的接口:Serializable, Cloneable
直接子类:ChoiceFormat, DecimalFormat

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、符点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

要获取具体语言环境的 NumberFormat,可调用 NumberFormat 的某个get**Instance()工厂方法 ,通常其就是 DecimalFormat 类型。

System.out.println(NumberFormat.getInstance() instanceof DecimalFormat);//true

通常不直接调用 DecimalFormat 的构造方法,因为 NumberFormat 的工厂方法可能返回不同于 DecimalFormat 的子类。
如果需要自定义格式对象,可执行:

NumberFormat f = NumberFormat.getInstance(loc);
if (f instanceof DecimalFormat) ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);

注意:DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。

DecimalFormat 包含一个模式 和一组符号。可直接使用 applyPattern() 或间接使用 API 方法来设置模式。符号存储在 DecimalFormatSymbols 对象中。使用 NumberFormat 工厂方法时,可从已本地化的 ResourceBundle 中读取模式和符号。

【特殊模式字符】
模式中的很多字符都是按字面解释的;在解析期间对其进行匹配,在格式化期间则不经改变地输出。另一方面,特殊字符代表了其他字符、字符串或字符类。如果要将其作为字面量出现在前缀或后缀中,那么除非另行说明,否则必须对其加引号。

下列字符用在非本地化的模式中。已本地化的模式使用从此格式器的 DecimalFormatSymbols 对象中获得的相应字符,这些字符已失去其特殊状态。两种例外是货币符号和引号,不将其本地化。
技术图片

符号含义:
1、0 一个数字(如果位数不足则以 0 填充)
2、# 一个数字,不包括 0(只要有可能就把数字拉上这个位置)
3、. 小数的分隔符的占位符
4、, 分组分隔符的占位符
5、; 分隔格式。
6、- 缺省负数前缀。
7、% 乘以 100 和作为百分比显示
8、? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 替十进制分隔符。
9、X 前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。

【API】
1、构造方法 DecimalFormat() 使用默认模式和默认语言环境的符号创建一个 DecimalFormat
2、构造方法 DecimalFormat(String pattern) 使用给定的模式和默认语言环境的符号创建一个 DecimalFormat
3、构造方法 DecimalFormat(String pattern, DecimalFormatSymbols symbols) 使用给定的模式和符号创建一个 DecimalFormat
4、void applyLocalizedPattern(String pattern) 将给定的模式应用于此 Format 对象。
5、void applyPattern(String pattern) 将给定的模式应用于此 Format 对象。
6、StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition) 格式化一个 double 值,以生成一个字符串。
7、StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition) 格式化一个 long 值,以生成一个字符串。
8、StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) 格式化一个数,并将所得文本追加到给定的字符串缓冲区。
9、AttributedCharacterIterator formatToCharacterIterator(Object obj) 格式化一个 Object,以生成一个 AttributedCharacterIterator。
10、DecimalFormatSymbols getDecimalFormatSymbols() 返回小数格式符号的一个副本,通常程序员或用户不改变此副本。
11、void setDecimalFormatSymbols(DecimalFormatSymbols newSymbols) 设置小数格式符号,通常程序员或用户不改变此符号。
12、Currency getCurrency() 获取格式化货币值时,此十进制格式使用的货币。
13、void setCurrency(Currency currency) 设置格式化货币值时,此数字格式使用的货币。
14、int getMultiplier() 获取百分数、千分数和类似格式中使用的乘数。对于百分数格式,将该乘数设置为 100 并将后缀设置为 ‘%‘。对于千分数格式,将该乘数设置为 1000 并将后缀设置为 ‘u2030‘。
15、void setMultiplier(int newValue) 设置百分数、千分数和类似格式中使用的乘数。
16、int getGroupingSize() 返回分组大小。
17、void setGroupingSize(int newValue) 设置分组大小。
18、RoundingMode getRoundingMode() 获取在此 DecimalFormat 中使用的 RoundingMode。
19、void setRoundingMode(RoundingMode roundingMode) 设置在此 DecimalFormat 中使用的 RoundingMode。
20、boolean isDecimalSeparatorAlwaysShown() 允许获取整数中小数分隔符的行为。
21、void setDecimalSeparatorAlwaysShown(boolean newValue) 允许设置整数中小数分隔符的行为。
22、boolean isParseBigDecimal() 返回 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal。
23、void setParseBigDecimal(boolean newValue) 设置 parse(java.lang.String, java.text.ParsePosition) 方法是否返回 BigDecimal。
24、int getMaximumFractionDigits() 获取某个数的小数部分中所允许的最大数字位数。
25、int getMaximumIntegerDigits() 获取某个数的整数部分中所允许的最大数字位数。
26、int getMinimumFractionDigits() 获取某个数的小数部分中所允许的最小数字位数。
27、int getMinimumIntegerDigits() 获取某个数的整数部分中所允许的最小数字位数。
28、void setMaximumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最大数字位数。
29、void setMaximumIntegerDigits(int newValue) 设置某个数字的整数部分中所允许的最大数字位数。
30、void setMinimumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最小数字位数。
31、void setMinimumIntegerDigits(int newValue) 设置某个数字的整数部分中所允许的最小数字位数。
32、String getNegativePrefix() 获取负数前缀。
33、String getNegativeSuffix() 获取负数后缀。
34、String getPositivePrefix() 获取正数前缀。
35、String getPositiveSuffix() 获取正数后缀。
36、void setNegativePrefix(String newValue) 设置负数前缀。
37、void setNegativeSuffix(String newValue) 设置负数后缀。
38、void setPositivePrefix(String newValue) 设置正数前缀。
39、void setPositiveSuffix(String newValue) 设置正数后缀。
40、Number parse(String text, ParsePosition pos) 解析字符串中的文本,以生成一个 Number。
41、String toLocalizedPattern() 合成一个表示此 Format 对象当前状态的、已本地化的模式字符串。
42、String toPattern() 合成一个表示此 Format 对象当前状态的模式字符串。

【测试代码】

public class Test {
public static void main(String[] args) {
testPatterns();
testPatterns2();
testDecimalFormat();
}

public static void testPatterns() {
    //DecimalFormat中,占位符 0 表示如果位数不足则以 0 填充,占位符 # 表示只要有可能就把数字拉上这个位置
    double pi = 3.1415927;
    System.out.println("-------------------3.1415927------------------");
    System.out.println(new DecimalFormat("0").format(pi)); //3
    System.out.println(new DecimalFormat("0.00").format(pi));//3.14
    System.out.println(new DecimalFormat("00.000").format(pi));//03.142
    System.out.println(new DecimalFormat("0.00%").format(pi));//以百分比方式计数,314.16%
    System.out.println(new DecimalFormat("#").format(pi)); //3
    System.out.println(new DecimalFormat("#.##").format(pi)); //3.14
    System.out.println(new DecimalFormat("##.###").format(pi)); //3.142
    System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%

    float f = 12.34f;
    System.out.println("---------------------12.34----------------");
    System.out.println(new DecimalFormat("0.0").format(f));//12.3
    System.out.println(new DecimalFormat("#.#").format(f));//12.3
    System.out.println(new DecimalFormat("000.000").format(f));//012.340
    System.out.println(new DecimalFormat("###.###").format(f));//12.34

    long l = 123456789L;
    System.out.println("-------------------123456789------------------");
    System.out.println(new DecimalFormat("#.##############E0").format(l));//1.23456789E8
    System.out.println(new DecimalFormat("00.##E00").format(l));//12.35E07
    System.out.println(new DecimalFormat(",###").format(l)); //每三位以逗号进行分隔。123,456,789
    System.out.println(new DecimalFormat("值为,###米/秒").format(l));//【值为123,456,789米/秒】
}

private static void testPatterns2() {
    double pi = 3.1415927;
    long l = 1234567890123456789L;
    int i = 10086;
    float f = 0.01f;

    System.out.println("--------------------#,##0.00-----------------");
    String pattern = "#,##0.00";//强制保留两位小数,整数部分每三位以逗号分隔,整数部分至少一位
    System.out.println(new DecimalFormat(pattern).format(pi));//3.14
    System.out.println(new DecimalFormat(pattern).format(l));//1,234,567,890,123,456,789.00
    System.out.println(new DecimalFormat(pattern).format(i));//10,086.00
    System.out.println(new DecimalFormat(pattern).format(f));//0.01

    System.out.println("--------------------NumberFormat-----------------");
    NumberFormat format = NumberFormat.getNumberInstance();
    format.setMinimumFractionDigits(2);
    format.setMaximumFractionDigits(2);//设置这两个以后,效果和上面一样,否则和【#,##0.###】一样
    System.out.println(format.format(pi));//3.14
    System.out.println(format.format(l));//1,234,567,890,123,456,789.00
    System.out.println(format.format(i));//10,086.00
    System.out.println(format.format(f));//0.01
}

private static void testDecimalFormat() {
    NumberFormat format = NumberFormat.getNumberInstance();
    if (format instanceof DecimalFormat) {
        DecimalFormat dFormat = (DecimalFormat) format;
        System.out.println("--------------------DecimalFormat-----------------");
        System.out.println(dFormat.getGroupingSize());//【3】分组大小
        System.out.println(dFormat.getRoundingMode());//【HALF_EVEN】
        System.out.println(dFormat.toPattern());//【#,##0.###】合成一个表示此 Format 对象当前状态的模式字符串
        System.out.println(dFormat.toLocalizedPattern());//【#,##0.###】合成一个表示此 Format 对象当前状态的、已本地化的模式字符串

        System.out.println("------------------位数-------------------");
        System.out.println(dFormat.getMaximumFractionDigits());//【3】
        System.out.println(dFormat.getMinimumFractionDigits());//【0】
        System.out.println(dFormat.getMaximumIntegerDigits());//【2147483647】也就是int类型的最大值
        System.out.println(dFormat.getMinimumFractionDigits());//【0】

        System.out.println("---------------------杂项----------------");
        System.out.println(dFormat.getCurrency());//【CNY】使用的货币符号,代码CNY(China Yuan)是ISO分配给中国的币种符号
        System.out.println(dFormat.getMultiplier());//【1】获取百分数、千分数等格式中使用的乘数(对于百分数格式,为100)
        System.out.println(dFormat.isDecimalSeparatorAlwaysShown());//【false】允许获取整数中小数分隔符的行为
        System.out.println(dFormat.isParseBigDecimal());//【false】parse(String,ParsePosition) 方法是否返回 BigDecimal
    }
}

}

ParsePosition 了解即可
ParsePosition 是 Format 及其子类所使用的简单类,用来在解析过程中跟踪当前位置。各种 Format 类中的 parseObject 方法要求将 ParsePosition 对象作为一个变量。
解析具有不同格式的字符串时,可以使用同一个 ParsePosition,因为索引参数记录的是当前位置。

API
1、构造方法 ParsePosition(int index) 创建一个具有给定初始索引的新 ParsePosition。
2、int getErrorIndex() 获取出错时的索引,如果没有设置错误索引,则为 -1。
3、void setErrorIndex(int ei) 设置解析出错时的索引。格式器应该在从它们的 parseObject 方法返回错误代码之前进行此设置。如果没有设置,则默认值为 -1。
4、int getIndex() 获取当前的解析位置。对于解析方法的输入,这是解析开始处字符的索引;对于输出,这是被解析的最后一个字符后的字符索引。
5、void setIndex(int index) 设置当前解析位置。

FieldPosition【没用过】
FieldPosition 是 Format 及其子类用于在格式输出中标识字段的简单类。字段可以通过两种方式标识:
1、通过一个其名称通常以 _FIELD 结尾的整型常量。这些常量在 Format 的不同子类中定义。
2、通过一个 Format.Field 常量,有关例子,请参阅 DateFormat 中的 ERA_FIELD 及其同类。
FieldPosition 保持对格式输出中字段位置的两个索引进行跟踪:字段的第一个字符的索引和字段的最后一个字符的索引。
不同的 Format 类中的 format 方法需要一个 FieldPosition 对象作为参数。使用此 format 方法执行部分格式化或者以获取格式化输出的信息(比如字段位置)。
如果对格式化字符串中所有属性的位置感兴趣,请使用 Format 的方法 formatToCharacterIterator。

API
1、构造方法 FieldPosition(Format.Field attribute) 为给定的字段常量创建一个 FieldPosition 对象。
2、构造方法 FieldPosition(Format.Field attribute, int fieldID) 为给定的字段创建一个 FieldPosition 对象。
3、构造方法 FieldPosition(int field) 为给定字段创建一个 FieldPosition 对象。
4、int getBeginIndex() 获取请求字段中第一个字符的索引。
5、int getEndIndex() 获取紧跟请求字段中最后一个字符的字符索引。
6、int getField() 获取字段的标识符。
7、Format.Field getFieldAttribute() 以来自 Field 子类之一的属性常量返回该字段的标识符。
8、void setBeginIndex(int bi) 设置起始索引。
9、void setEndIndex(int ei) Sets the end index.由 Format 的子类使用。

RoundingMode 重要
为可能丢弃精度的数值操作指定一种舍入行为。每种舍入模式都指示如何计算返回舍入结果位数的最低有效位。如果返回的位数比表示精确数值结果所需的位数少,则舍弃的位数称为舍弃部分,而不管这些位数对数值的作用如何。换句话说,假设是一个数值,舍弃部分的绝对值可能大于 1。

注意:
NumberFormat默认使用的是HALF_EVEN模式,不符合"四舍五入"的模式,我们最好改为HALF_UP模式。

不同舍入模式下的舍入操作
1、、UP 向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。
2、DOWN 向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。
3、CEILING 向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小。
4、FLOOR 向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小。
5、HALF_UP 向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与 ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。
6、HALF_DOWN 向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。
7、HALF_EVEN 向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。
8、UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

将输入数字舍入为一位数时,不同舍入模式格式化后的结果
技术图片

DecimalFormatSymbols 了解即可
此类表示了 DecimalFormat 格式化数字所需的符号集(如小数点、组分隔符等等)。DecimalFormat 根据其语言环境数据为其自身创建一个 DecimalFormatSymbols 实例。如果需要更改这些符号,可从 DecimalFormat 获得 DecimalFormatSymbols 对象并修改它。

【API】
构造方法
1、DecimalFormatSymbols() 为默认的语言环境创建一个 DecimalFormatSymbols 对象。
2、DecimalFormatSymbols(Locale locale) 为给定的语言环境创建一个 DecimalFormatSymbols 对象。
静态方法
1、static Locale[] getAvailableLocales() 返回一个数组,它包括所有此类的 getInstance 方法可为之返回本地化实例的语言环境。
2、static DecimalFormatSymbols getInstance() 获取默认语言环境的 DecimalFormatSymbols 实例。
3、static DecimalFormatSymbols getInstance(Locale locale) 获取指定语言环境的 DecimalFormatSymbols 实例。
get方法
1、Currency getCurrency() 获得这些 DecimalFormatSymbols 的货币。
2、String getCurrencySymbol() 返回这些 DecimalFormatSymbols 货币在其语言环境中的货币符号。
3、char getDecimalSeparator() 获得用于十进制符号的字符。
4、char getDigit() 获得用于某种模式中数字的字符。
5、String getExponentSeparator() 返回用于分隔尾数和指数的字符串。
6、char getGroupingSeparator() 获得用于千位分隔符的字符。
7、String getInfinity() 获得用于表示无穷大的字符串。
8、String getInternationalCurrencySymbol() 返回这些 DecimalFormatSymbols 货币的 ISO 4217 货币代码。
9、char getMinusSign() 获得用于表示减号的字符。
10、char getMonetaryDecimalSeparator() 返回货币小数点分隔符。
11、String getNaN() 获得用于表示“非数字”的字符串。
12、char getPatternSeparator() 获得用于在模式中分隔正数和负数子模式的字符。
13、char getPercent() 获得用于百分数符号的字符。
14、char getPerMill() 获得用于千分数符号的字符。
15、char getZeroDigit() 获得用于零的字符。
set方法
1、void setCurrency(Currency currency) 设置这些 DecimalFormatSymbols 的货币。
2、void setCurrencySymbol(String currency) 设置这些 DecimalFormatSymbols 货币在其语言环境中的货币符号。
3、void setDecimalSeparator(char decimalSeparator) 设置用于十进制符号的字符。
4、void setDigit(char digit) 设置用于某种模式中数字的字符。
5、void setExponentSeparator(String exp) 设置用于分隔尾数和指数的字符串。
6、void setGroupingSeparator(char groupingSeparator) 设置用于千位分隔符的字符。
7、void setInfinity(String infinity) 设置用于表示无穷大的字符串。
8、void setInternationalCurrencySymbol(String currencyCode) 设置这些 DecimalFormatSymbols 货币的 ISO 4217 货币代码。
9、void setMinusSign(char minusSign) 设置用于表示减号的字符。
10、void setMonetaryDecimalSeparator(char sep) 设置货币小数点分隔符。
11、void setNaN(String NaN) 设置用于表示“非数字”的字符串。
12、void setPatternSeparator(char patternSeparator) 设置用于在模式中分隔正数和负数子模式的字符。
13、void setPercent(char percent) 设置用于百分数符号的字符。
14、void setPerMill(char perMill) 设置用于千分数符号的字符。
15、void setZeroDigit(char zeroDigit) 设置用于零的字符。

【测试代码】

public class Test {
public static void main(String[] args) {
DecimalFormat format = (DecimalFormat) NumberFormat.getNumberInstance();
DecimalFormatSymbols symbols = format.getDecimalFormatSymbols();

    System.out.println("---------------------DecimalFormatSymbols----------------");
    System.out.println(symbols.getDecimalSeparator());//【.】用于十进制符号的字符
    System.out.println(symbols.getDigit());//【#】用于某种模式中数字的字符
    System.out.println(symbols.getExponentSeparator());//【E】用于分隔尾数和指数的字符串
    System.out.println(symbols.getGroupingSeparator());//【,】用于千位分隔符的字符
    System.out.println(symbols.getMinusSign());//【-】用于表示减号的字符
    System.out.println(symbols.getMonetaryDecimalSeparator());//【.】货币小数点分隔符
    System.out.println(symbols.getPercent());//【%】用于百分数符号的字符
    System.out.println(symbols.getPerMill());//【‰】用于千分数符号的字符
    System.out.println(symbols.getZeroDigit());//【0】用于零的字符

    System.out.println("---------------------2----------------");
    System.out.println(symbols.getCurrency());//【CNY】货币
    System.out.println(symbols.getInternationalCurrencySymbol());//【CNY】货币的 ISO 4217 货币代码
    System.out.println(symbols.getCurrencySymbol());//【¥】货币在其语言环境中的货币符号
    System.out.println(symbols.getInfinity());//【∞】获得用于表示无穷大的字符串
    System.out.println(symbols.getNaN());//【?】获得用于表示“非数字”的字符串
    System.out.println(symbols.getPatternSeparator());//【;】用于在模式中分隔正数和负数子模式的字符
    System.out.println(Arrays.toString(DecimalFormatSymbols.getAvailableLocales()));//可使用的语言环境
}

}

可使用的语言环境
[, ar_AE, ar_JO, ar_SY, hr_HR, fr_BE, es_PA, mt_MT, es_VE, bg, zh_TW, it, ko, uk, lv, da_DK, es_PR, vi_VN, en_US, sr_ME, sv_SE, es_BO, en_SG, ar_BH, pt, ar_SA, sk, ar_YE, hi_IN, ga, en_MT, fi_FI, et, sv, cs, sr_BA_#Latn, el, uk_UA, hu, fr_CH, in, es_AR, ar_EG, ja_JP_JP_#u-ca-japanese, es_SV, pt_BR, be, is_IS, cs_CZ, es, pl_PL, tr, ca_ES, sr_CS, ms_MY, hr, lt, es_ES, es_CO, bg_BG, sq, fr, ja, sr_BA, is, es_PY, de, es_EC, es_US, ar_SD, en, ro_RO, en_PH, ca, ar_TN, sr_ME_#Latn, es_GT, sl, ko_KR, el_CY, es_MX, ru_RU, es_HN, zh_HK, no_NO_NY, hu_HU, th_TH, ar_IQ, es_CL, fi, ar_MA, ga_IE, mk, tr_TR, et_EE, ar_QA, sr_#Latn, pt_PT, fr_LU, ar_OM, th, sq_AL, es_DO, es_CU, ar, ru, en_NZ, sr_RS, de_CH, es_UY, ms, el_GR, iw_IL, en_ZA, th_TH_TH#u-nu-thai, hi, fr_FR, de_AT, nl, no_NO, en_AU, vi, nl_NL, fr_CA, lv_LV, de_LU, es_CR, ar_KW, sr, ar_LY, mt, it_CH, da, de_DE, ar_DZ, sk_SK, lt_LT, it_IT, en_IE, zh_SG, ro, en_CA, nl_BE, no, pl, zh_CN, ja_JP, de_GR, sr_RS_#Latn, iw, en_IN, ar_LB, es_NI, zh, mk_MK, be_BY, sl_SI, es_PE, in_ID, en_GB]

以上是关于数值格式化 NumberFormat DecimalFormat RoundingMode的主要内容,如果未能解决你的问题,请参考以下文章

在共享包中使用 GWT 的 NumberFormat 类

JAVA金额格式字符串转数值

java 求 两个数的百分比% (转)

PHPExcel如何设置某列的格式为数值

SQL数值转字符串保留指定小数位

SQL数值转字符串保留指定小数位