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))));
因为时间问题,描述的比较简单,以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java SpringMVC框架开发之数据导出Excel文件格式实例详解
这篇文章主要介绍了Java基础开发之数据导出Excel文件格式实例详解,需要的朋友可以参考下2020-02-02Java中的UrlDecoder 和 UrlEncoder_动力节点Java学院整理
HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。下文通过实例代码给大家介绍Java中的UrlDecoder 和 UrlEncoder知识,感兴趣的的朋友一起看看吧2017-07-07springsecurity记住我登录时访问无权限接口跳转登录界面的处理方案
这篇文章主要介绍了springsecurity记住我登录时访问无权限接口跳转登录界面的处理方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-02-02java定位死锁的三种方法(jstack、Arthas和Jvisualvm)
这篇文章主要给大家介绍了关于java定位死锁的三种方法,分别是通过jstack定位死锁信息、通过Arthas工具定位死锁以及通过 Jvisualvm 定位死锁,文中还介绍了死锁的预防方法,需要的朋友可以参考下2021-09-09
最新评论