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

 更新时间:2021年10月12日 11:10:46   作者:Android涛  
这篇文章主要介绍了DecimalFormat数字格式化 0和# 的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

先来介绍一下“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.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类型:

DecimalFormat d = new DecimalFormat("#0.00");
d.setRoundingMode(RoundingMode.HALF_UP);
Double.valueOf(d.format(new BigDecimal(String.valueOf(0.145d))));

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

相关文章

  • SpringBoot 的 web 类型推断详解

    SpringBoot 的 web 类型推断详解

    这篇文章主要介绍了SpringBoot 的 web 类型推断详解的相关资料,需要的朋友可以参考下
    2022-12-12
  • springboot中@ConfigurationProperties无效果的解决方法

    springboot中@ConfigurationProperties无效果的解决方法

    本文主要介绍了springboot中@ConfigurationProperties无效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java 创建线程的3种方法及各自的优点

    Java 创建线程的3种方法及各自的优点

    这篇文章主要介绍了Java 创建线程的3种方法及各自的优点,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 聊聊mybatis sql的括号问题

    聊聊mybatis sql的括号问题

    这篇文章主要介绍了mybatis sql的括号问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Spring RestTemplate基本使用介绍

    Spring RestTemplate基本使用介绍

    这篇文章主要介绍了Spring RestTemplate基本使用介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 解决maven没有打包xml文件的问题

    解决maven没有打包xml文件的问题

    这篇文章主要介绍了解决maven没有打包xml文件的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 浅谈spring注解之@profile

    浅谈spring注解之@profile

    这篇文章主要介绍了浅谈spring注解之@profile,@profile通过配置来改变参数,这里整理的详细的用法,有兴趣的可以了解一下
    2017-10-10
  • SpringBoot接收参数所有方式总结

    SpringBoot接收参数所有方式总结

    这篇文章主要介绍了SpringBoot接收参数所有方式总结,文中通过代码示例和图文结合的方式给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • Java算法之时间复杂度和空间复杂度的概念和计算

    Java算法之时间复杂度和空间复杂度的概念和计算

    这篇文章主要介绍了Java算法之时间复杂度和空间复杂度的概念和计算,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-05-05
  • hadoop 全面解读自定义分区

    hadoop 全面解读自定义分区

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储
    2022-02-02

最新评论