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

网友投稿 379 2022-09-22


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

目录先来介绍一下“0”和“#”的区别1. 以“0”补位时2. 以“#”补位时小结一下DecimalFormat 数据四舍五入格式化处理问题探索结果

先来介BftcgzS绍一下“0”和“#”的区别

1. 以“0”补位时

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

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

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

2. 以“#”补位时

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

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

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

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 数据四舍五入格式化处理

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

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

d.formhttp://at(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类型:

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

d.setRoundingMode(RoundingMode.HALF_UP);

Double.valueOf(d.format(new BigDecimal(String.valueOf(0.145d))));


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:PPP认证之CHAP
下一篇:OSPF的1、2、3类LSA和域内路由、域间路由(ospf使用的路由选择算法为)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~