1.1、结论:
- 如果最终结果要的是数值,则优先使用 BigDecimal自有API 。如:decimal.setScale(2,BigDecimal.ROUND_HALF_UP) ,其中第二个参数为‘进位模式’,根据实际情况选择进位模式即可。【特别注意】由于 BigDecimal 对象是不可变的,因此此方法的调用不会 导致初始对象被修改,setScale 返回具有适当标度的新对象。
- 如果最终结果需要格式化为非数值的字符串,可以考虑采用 DecimalFormat 。【特别注意】DecimalFormat不同的格式模版,在不同场景中显示的特殊性,尤其是,"#.#"对于整数位为零时显示的特殊性(如,“0.12”会显示为".1")。
1.2、BigDecimal自有API 方法 : decimal.setScale(2,BigDecimal.ROUND_HALF_UP)
1.2.1、setScale() 方法,参数解释及作用
decimal.setScale(2,BigDecimal.ROUND_HALF_UP)
参数1:代表小数点后保留的位数。此为保留两位小数。
参数2:小数点后的数值,如果需要进位时,进位舍入的方式。BigDecimal.ROUND_HALF_UP 为四舍五入进位方式。
以上代码块中的代码,表示“保留两位小数,按照四舍五入方式进位”。其中程序在处理时,按照以下逻辑处理:
- 整数部分如果没有值,会自动赋值为零。
- 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则按照四舍五入进位处理。
1.2.2、代码自测实践
---- setScale(2,BigDecimal.ROUND_HALF_UP) 程序在处理时,按照以下逻辑处理:
---- 整数部分如果没有值,会自动赋值为零。
---- 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则按照四舍五入进位处理。
public static void main(String[] args) {
BigDecimal decimal = new BigDecimal("0");
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.00
decimal = new BigDecimal(1.1/100); // 0.011
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.01
decimal = new BigDecimal(50.1/100); // 0.501
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 0.50
decimal = new BigDecimal(-1.1/100); // -0.011
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// -0.01
decimal = new BigDecimal(-50.1/100); // -0.501
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// -0.50
decimal = new BigDecimal("2");
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.00
decimal = new BigDecimal("2.2");
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.20
decimal = new BigDecimal("2.456");
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.46
decimal = new BigDecimal("2.451");
System.out.println(decimal.setScale(2,BigDecimal.ROUND_HALF_UP));// 2.45
}
----- 日志打印结果:
0.00
0.01
0.50
-0.01
-0.50
2.00
2.20
2.46
2.45
1.3、使用 DecimalFormat 进行格式化 : 结果可以是数值,也可以格式化为非数值的字符串(如:A2.45B)
1.3.1、DecimalFormat 使用样例
//设置格式化的模版,如:"0000.0000"、"0.##"等
DecimalFormat df1 = new DecimalFormat("0000.0000");
BigDecimal decimal = new BigDecimal("123.123");
//格式化decimal的值
df1.format(decimal) // 格式化后,值为 0123.1230
【特别注意】使用 DecimalFormat 进行格式化 : 结果可以是数值,也可以格式化为非数值的字符串(如:A2.45B)。
1.3.2、格式化模版,特殊字符说明
特殊字符说明:
- “0” 指定位置不存在数字,则显示为0 ,如:格式模版为 '0000.0000',则 123.123 结果为 0123.1230
- “#” 指定位置不存在数字,则不显示, 如:格式模版为'####.####' , 则 123.123 结果为 123.123
- “.” 表示小数点
- “%” 会将结果数字乘以100,后面再加上% 进行显示。如:格式模版为'#.00%' , 则 123.123 结果为 12312.30%
代码自测实践
public static void main(String[] args) {
DecimalFormat df1 = new DecimalFormat("0000.0000");
DecimalFormat df2 = new DecimalFormat("####.####");
DecimalFormat df3 = new DecimalFormat("#.00%");
BigDecimal decimal = new BigDecimal("123.123");
System.out.println(df1.format(decimal)); // 0123.1230
System.out.println(df2.format(decimal)); // 123.123
System.out.println(df3.format(decimal)); // 12312.30%
}
---- 日志打印结果:
0123.1230
123.123
12312.30%
1.3.3、使用 DecimalFormat,将结果保留两位小数
模版一:
DecimalFormat df1 = new DecimalFormat("0.00");
结果:
整数位为零时,不会出现舍去整数位的情况,会显示为零。
小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。
模版二:
DecimalFormat df1 =new DecimalFormat("#.00");
结果:
整数位为零时,会舍去整数位,如结果为“.00”、“.12” 。整数位不为零时,正常显示。
小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。
1.3.4、使用 DecimalFormat,将结果保留两位小数,并且在前后加上字符
格式模版:"A.00B"
DecimalFormat df1 = new DecimalFormat("A.00B");
结果:
0.00时,结果为:A.00B
0.12时,结果为:A.12B
2.00时,结果为:A2.00B
2.46时,结果为:A2.46B
1.3.5、代码自测实践
1、格式化模版: "0.00"、"8.00"、"88.00"、"A.00"、"A.00B"
public static void main(String[] args) {
// 整数位为零时,不会出现舍去整数位的情况,整数位会赋值为零。
// 小数部分,会固定保留两位小数。如果没有值,则补零。如果小数超过两位,则进位处理。
DecimalFormat df1 = new DecimalFormat("0.00");
BigDecimal decimal = new BigDecimal("0");
System.out.println(df1.format(decimal)); // 0.00
decimal = new BigDecimal("0.123");
System.out.println(df1.format(decimal)); // 0.12
decimal = new BigDecimal("-0.123");
System.out.println(df1.format(decimal)); // -0.12
decimal = new BigDecimal("2");
System.out.println(df1.format(decimal)); // 2.00
decimal = new BigDecimal("2.2");
System.out.println(df1.format(decimal)); // 2.20
decimal = new BigDecimal("2.456");
System.out.println(df1.format(decimal)); // 2.46
decimal = new BigDecimal("2.451");
System.out.println(df1.format(decimal)); // 2.45
decimal = new BigDecimal("-2.456");
System.out.println(df1.format(decimal)); // -2.46
decimal = new BigDecimal("-2.451");
System.out.println(df1.format(decimal)); // -2.45
}
------ 日志打印结果:
0.00
0.12
-0.12
2.00
2.20
2.46
2.45
-2.46
-2.45
-------------------------- 改动一:修改格式为 "8.00"
DecimalFormat df1 = new DecimalFormat("8.00");
日志打印结果:相当于先通过"#.00"计算结果,然后再在计算结果的前面加一个8
8.00
8.12
-8.12
82.00
82.20
82.46
82.45
-82.46
-82.45
-------------------------- 改动二:修改格式为 "88.00"
DecimalFormat df1 = new DecimalFormat("88.00");
日志打印结果:
88.00
88.12
-88.12
882.00
882.20
882.46
882.45
-882.46
-882.45
-------------------------- 改动三:修改格式为 "A.00"
DecimalFormat df1 = new DecimalFormat("A.00");
日志打印结果:
A.00
A.12
-A.12
A2.00
A2.20
A2.46
A2.45
-A2.46
-A2.45
-------------------------- 改动四:修改格式为 "A.00B"
DecimalFormat df1 = new DecimalFormat("A.00B");
日志打印结果:
A.00B
A.12B
-A.12B
A2.00B
A2.20B
A2.46B
A2.45B
-A2.46B
-A2.45B
2、格式化模版:"#.00"、"#.0#"、"#.#0"
public static void main(String[] args) {
//整数位为零时,会舍去整数位,如:“.00”、“.12”
DecimalFormat df1 = new DecimalFormat("#.00");
BigDecimal decimal = new BigDecimal("0");
System.out.println(df1.format(decimal)); // .00
decimal = new BigDecimal("0.123");
System.out.println(df1.format(decimal)); // .12
decimal = new BigDecimal("-0.123");
System.out.println(df1.format(decimal)); // -.12
decimal = new BigDecimal("2");
System.out.println(df1.format(decimal)); // 2.00
decimal = new BigDecimal("2.2");
System.out.println(df1.format(decimal)); // 2.20
decimal = new BigDecimal("2.456");
System.out.println(df1.format(decimal)); // 2.46
decimal = new BigDecimal("2.451");
System.out.println(df1.format(decimal)); // 2.45
decimal = new BigDecimal("-2.456");
System.out.println(df1.format(decimal)); // -2.46
decimal = new BigDecimal("-2.451");
System.out.println(df1.format(decimal)); // -2.45
}
----- 日志打印结果:
.00
.12
-.12
2.00
2.20
2.46
2.45
-2.46
-2.45
--------------------------------------- 改动一 : 修改格式为 "#.0#"
DecimalFormat df1 = new DecimalFormat("#.0#");
日志打印结果如下:小数点后的第二位,有值时显示对应值,没有值时不显示。
.0
.12
-.12
2.0
2.2
2.46
2.45
-2.46
-2.45
--------------------------------------- 改动二 : 修改格式为 "#.#0"
DecimalFormat df1 = new DecimalFormat("#.#0");
运行程序时,抛出异常:
Exception in thread "main" java.lang.IllegalArgumentException: Malformed pattern "#.#0"
at java.text.DecimalFormat.applyPattern(DecimalFormat.java:3444)
at java.text.DecimalFormat.<init>(DecimalFormat.java:436)
3、格式化模版:"#.##"
public static void main(String[] args) {
//整数位为零时,不会出现舍去整数位的情况,整数位会赋值为零。
//小数位,根据实际的小数位数,保留一位或两位。超过两位时,按照进位处理。
DecimalFormat df1 = new DecimalFormat("#.##");
BigDecimal decimal = new BigDecimal("0");
System.out.println(df1.format(decimal)); // 0
decimal = new BigDecimal("0.123");
System.out.println(df1.format(decimal)); // 0.12
decimal = new BigDecimal("-0.123");
System.out.println(df1.format(decimal)); // -0.12
decimal = new BigDecimal("2");
System.out.println(df1.format(decimal)); // 2
decimal = new BigDecimal("2.2");
System.out.println(df1.format(decimal)); // 2.2
decimal = new BigDecimal("2.456");
System.out.println(df1.format(decimal)); // 2.46
decimal = new BigDecimal("2.451");
System.out.println(df1.format(decimal)); // 2.45
decimal = new BigDecimal("-2.456");
System.out.println(df1.format(decimal)); // -2.46
decimal = new BigDecimal("-2.451");
System.out.println(df1.format(decimal)); // -2.45
}
------ 日志打印结果:
0
0.12
-0.12
2
2.2
2.46
2.45
-2.46
-2.45