一、几种四舍五入的方法
public static class Test { public static void main(String[] args) { String str = "111.675"; //方法1:DecimalFormat DecimalFormat df = new DecimalFormat("#.00"); try { Number n = df.parse(str); Double d = n.doubleValue(); System.out.println("" + d); } catch (ParseException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } String aString = df.format(Double.parseDouble(str)); System.out.println(aString); //方法2:NumberFormat NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(2); try { Number n = nf.parse(str); double d = n.doubleValue(); System.out.println("" + d); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(nf.format(Double.parseDouble(str))); //方法三:算术 double d = ((double)Math.round(Double.parseDouble(str) * 100)) / 100; System.out.println("" + d); BigDecimal bd = new BigDecimal(str).setScale(2, RoundingMode.HALF_UP); double dd = bd.doubleValue(); System.out.println(bd.toString()); System.out.println("" + dd); } }
结果如下:
111.675
111.68
111.675
111.68
111.68
111.68
111.68
通过结果可以看到,DecimalFormat和NumberFormat在将String转换成数字的过程中,没有进行四舍五入;在调用format的时候,才根据设置进行了四舍五入的转换。
这两个类即使使用setRoundingMode也是相同的结果。而使用BigDecimal转换时,可以在String转换成数字的过程中,进行四舍五入。
二、RoundingMode(从另一博客中直接截取)
ROUND_CEILING: 舍位时往正无穷方向移动 1.1->2 1.5->2 1.8->2 -1.1->-1 -1.5->-1 -1.8->-1
ROUND_DOWN:向0的方向移动1.1->1 1.5->1 1.8->1 -1.1->-1 -1.5->-1 -1.8>-1
ROUND_FLOOR:与CEILING相反,往负无穷 1.1->1 1.5->1 1.8->1 -1.1->-2 -1.5->-2 -1.8->-2
ROUND_HALF_DOWN:以5为分界线,或曰五舍六入1.5->1 1.6->1 -1.5->-1 -1.6->-2 1.15->1.1 1.16->1.2 1.55->1.6 1.56->1.6
ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数1.15->1.2 1.16->1.2 1.25->1.2 1.26->1.3
ROUND_HALF_UP:最常见的四舍五入
ROUND_UNNECESSARY:无需舍位
ROUND_UP:与ROUND_DOWN,远离0的方向1.1->2 1.5->2 1.8->2 -1.1->-2 -1.5->-2 -1.8->-2
摘录自: