好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

DecimalFormat数字格式化 0和# 的区别及说明

先来介绍一下[0]和[#]的区别

1. 以[0]补位时

如果数字少了,就会补[0],小数和整数都会补;

如果数字多了,就切掉,但只切小数的末尾,整数不能切;

同时被切掉的小数位会进行四舍五入处理。

2. 以[#]补位时

如果数字少了,则不处理,不会补[0],也不会补[#];

如果数字多了,就切掉,但只切小数的末尾,整数不能切;

同时被切掉的小数位会进行四舍五入处理。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

public class PriceUtil {

     public static String decimalFormat( float value) {

         DecimalFormat decimalFormat;

         decimalFormat = new DecimalFormat();

         decimalFormat.applyPattern( "0.##" );

         return decimalFormat.format(value);

     }

 

     public static String decimalFormat( double value) {

         DecimalFormat decimalFormat;

         decimalFormat = new DecimalFormat();

         decimalFormat.applyPattern( "0.##" );

         return decimalFormat.format(value);

     }

 

     public static String decimalFormat(String value) {

         if (value== null ||value.isEmpty())

             return "0.00" ;

         double d = Double.parseDouble(value);

         DecimalFormat decimalFormat;

         decimalFormat = new DecimalFormat();

         decimalFormat.applyPattern( "0.##" );

         return decimalFormat.format(d);

     }

}

小结一下

1. [0]强制按格式对齐,[#]最充足的情况下以这样的格式对齐;

2. [#]适用的场景是当小数位超过两位时,只显示两位,但只有一位或没有,则不需要补[0];

3. 整数位用多个[#]没有意义。

大家想用什么样的格式,可以自己去组装。

DecimalFormat 数据四舍五入格式化处理

最近的开发中,被测试的小伙伴告知,相同四舍五入处理逻辑的数据有一个有问题。当时的自己是懵逼的,我的处理方式是这样的,业务要求是四舍五入保留两位小数:

?

1

2

DecimalFormat d = new DecimalFormat( "#0.00" );

d.format( 0 .145d);

这样的数据,期望结果是0.15,但是实际的结果是0.14,,,,,为什么呢?为什么呢?

问题探索

对此,各种寻找原因,终于有点眉目,这里做大概的说明,详细的原因小伙伴们可以 参考这篇文章

1.DecimalFormat 格式化数据,如果不指定方式,默认为HALF_EVEN,实际应该是HALF_UP;(HALF_EVEN 被舍位是5(如保留两位小数的2.115),后面还有非0值进1(如保留两位小数的2.11500001 格式化为2.12),5后面没有数字或者都是0时,前面是偶数则舍,是奇数则进1,目标是让被舍前一位变为偶数。HALF_UP:真正的四舍五入)

2. 使用BigDecimal时,参数尽量传入字符串,要比传入double精准.因为double的精度容易丢失;

结果

为了不大幅度的改动代码,所以最后将数据格式化改为使用BigDecimal类型:

?

1

2

3

DecimalFormat d = new DecimalFormat( "#0.00" );

d.setRoundingMode(RoundingMode.HALF_UP);

Double.valueOf(d.format( new BigDecimal(String.valueOf( 0 .145d))));

因为时间问题,描述的比较简单,以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_40441190/article/details/85679760

查看更多关于DecimalFormat数字格式化 0和# 的区别及说明的详细内容...

  阅读:29次