代码:
double a = 13.245;
//方法一:
BigDecimal bd= new BigDecimal(a);
Double b = bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("方法一: "+b);
//方法二:
Double myValue = new BigDecimal(a).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
nf.setGroupingUsed(false);
System.out.println("方法二: "+myValue);
//方法三:
// #.00 表示两位小数 #.0000四位小数
DecimalFormat df2 =new DecimalFormat("#.00");
String str2 =df2.format(a);
System.out.println("方法三: "+str2);
//方法四:
//%.2f 中的% 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型
String result = String.format("%.2f", a);
System.out.println("方法四: "+result);
解析:
//保留两位时 :0.245 0.295 保留一位时: 0.45 0.95
当double a = 13.245时,输出结果为:
方法一: 13.24
方法二: 13.24
方法三: 13.24
方法四: 13.25
当double a = 13.295时,输出结果为:
方法一: 13.29
方法二: 13.29
方法三: 13.29
方法四: 13.30
当保留一位小数时,若小数点后两位是 45 或 95 时,前三个方法也会有误差.
当double a = 0.295时,输出结果为:
方法一: 0.29
方法二: 0.29
方法三: .29
方法四: 0.30
当小数点前的数只有一个 0 时,可以发现方法三错的离谱.
综上,显然,使用第四种方法进行四舍五入更加精确.