JavaDecimalFormat四舍五⼊的坑及正确⽤法
⼀、DecimalFormat四舍五⼊的坑
1.1 有时候我们在处理⼩数保留⼏位⼩数时,想到了DecimalFormat这个类的使⽤,百度搜⼀把可能⽤到以下⽅式。
1public static void main(String[] args) {bigdecimal格式化两位小数
2 String str="3.145";
3 System.out.println(round1(str));
4 }
5
6static String round1(String str){
7double a=Double.parseDouble(str);
8 DecimalFormat df=new DecimalFormat("###.00");
9return df.format(a);
10 }
1.2 初看好像没什么问题,四舍五⼊保留两位⼩数,最后输出3.15。当然精度要求不⾼,也⽆需计较。当涉及到精确统计时,这⾥的坑来了将上⾯的字符串改为“5”前⾯为奇数,如“3.155”,就⽠了,输出3.15。显然这⾥没满⾜要求,不是我们学校⾥的四舍五⼊。再上⼀段代码。
1static String round2(String str){
2double a=Double.parseDouble(str);
3 DecimalFormat df=new DecimalFormat("###.00");
4 df.setRoundingMode(RoundingMode.HALF_UP);
5return df.format(a);
6 }
这⾥可以看到这个setRoundingMode()⽅法可以设定四舍五⼊的模式,原来四舍五⼊不光有我们学校
⾥学的那种,还有其他模式。DecimalFormat默认情况下,它使⽤ RoundingMode.HALF_EVEN,此舍⼊模式也称为“银⾏家舍⼊法”,主要在美国使⽤。RoundingMode.HALF_UP这个模式才是我们学校⾥学的标准四舍五⼊模式。以上代码虽然舍了学校型模式仍然不准确,应该将double类型改为BigDecimal类型。
⼆、学校型四舍五⼊⼏种正确使⽤
2.1 String直接格式化
1static String round3(String str){
2double d=Double.parseDouble(str);
3return String.format("%.2f",d);
4 }
2.2 BigDecimal结合DecimalFormat,BigDecimal⽐较好性能,数据处理量⼤不建议使⽤。
1static String round4(String str){
2 BigDecimal bigDecimal=new BigDecimal(str);
3 DecimalFormat df=new DecimalFormat("###.00");
4 df.setRoundingMode(RoundingMode.HALF_UP);
5return df.format(bigDecimal);
6 }
2.3 BigDecimal单独使⽤,这个类也⾃带舍⼊模式设定⽅法。
1static String round5(String str){
2 BigDecimal bigDecimal=new BigDecimal(str);
3return String.valueOf(bigDecimal.setScale(2,RoundingMode.HALF_UP));
4 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论