DecimalFormat(取舍问题,DecimalFormat四舍五入的坑)

背景:

回顾上文,由于double类型转String类型数字过小或者过大时,会自动转为科学计数法。需采用decimal format来格式化double与float的结果,这样转换成字符串不会采用科学计数法。但是根据“#”占位符进行转换时,发现获得的结果并非按照四舍五入的舍入数值方法。

 public static void main(String args[]) {
        Double a = 3.25,b = 3.251,c = 3.35;

        DecimalFormat df = new DecimalFormat("#.#");
        System.out.println(df.getRoundingMode());//decimal format默认舍入方法
        System.out.println("a:" + df.format(a) + "\n" + "b:" + df.format(b) + "\n" + "c:" + df.format(c));
    }

DecimalFormat 默认使用的是进位方式是RoundingMode.HALF_EVEN,此舍入模式也称为“银行家算法”,主要在美国使用。

银行家算法:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一

规律就是看进舍位的前一位是奇数还是偶数
奇数:四舍五入
偶数:五舍六入
若进舍位是5,且后面非0:进一

如3.25 保存一位小数,进舍位前一位是2,2是偶数,五舍六入 结果就是3.2,如果是3.26 结果就是3.3;
如3.251 保存一位小数,5后面非0,所以会进一,即3.3;
再如3.35 保存一位小数 进舍位前一位是3,3是奇数,四舍五入 结果就是3.4。

如果想实现四舍五入,增加下面代码,切换进位方式

df.setRoundingMode(RoundingMode.HALF_UP);

public static void main(String[] args) {
    DecimalFormat df=new DecimalFormat("#.#");
    df.setRoundingMode(RoundingMode.HALF_UP);//HALF_UP四舍五入
    double a=3.25,b=3.35;
    System.out.println(df.format(a)); //3.3
    System.out.println(df.format(3.251)); //3.3
    System.out.println(df.format(b)); //3.4
}

Java 中保留小数方法

1. 使用java.text.DecimalFormat

public static String format2(double value) {
     DecimalFormat df = new DecimalFormat("0.00");
     df.setRoundingMode(RoundingMode.HALF_UP);
     return df.format(value);
}

2. 使用java.text.NumberFormat

public static String format3(double value) {
     NumberFormat nf = NumberFormat.getNumberInstance();
     nf.setMaximumFractionDigits(2);
     /*
      * setMinimumFractionDigits设置成2
      * 
      * 如果不这么做,那么当value的值是100.00的时候返回100
      * 
      * 而不是100.00
      */
     nf.setMinimumFractionDigits(2);
     nf.setRoundingMode(RoundingMode.HALF_UP);
     /*
      * 如果想输出的格式用逗号隔开,可以设置成true
      */
     nf.setGroupingUsed(false);
     return nf.format(value);
}

3. 使用java.util.Formatter

public static String format4(double value) {
 /*
  * %.2f % 表示 小数点前任意位数 2 表示两位小数 格式后的结果为 f 表示浮点型
  */
 return new Formatter().format("%.2f", value).toString();
}

4. 使用String.format

public static String format5(double value) {
      return String.format("%.2f", value).toString();
}

扩展知识
String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能。

占位符格式为: %[index$][标识]*[最小宽度][.精度]转换符

double num = 123.4567899;
System.out.
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值