关于java四舍五入时遇五不进位的问题

在数据处理的过程中,碰到了保留小数点两位和四舍五入的问题。首先也是百度了网上的方法:

double a;
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
Double get_double = Double.parseDouble(df.format(a));

发现当a的值为3.355时结果为3.35,不是3.36.找原因,发现是DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用RoundingMode.HALF_EVEN。要是真正的四舍五入,需要将RoundingMode设定为RoundingMode.HALF_UP,修改如下:

double a=3.355;
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
Double get_double = Double.parseDouble(df.format(a));

运行修改后程序,发现结果仍然是3.35。最后找原因,发现df.format()中format()函数的入参为BigDecimal,在double转BigDecimal的时候BigDecimal BigDecimal(double d)不允许使用,因为这样会使3.355转化后变成3.3549999999999999,影响精度,应该使用如下方式转化

BigDecimal BigDecimal(String s); //常用,推荐使用
static BigDecimal valueOf(double d); //常用,推荐使用
还有如下几种方法可以:

double a=3.355;
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.HALF_UP);
Double get_double = Double.parseDouble(df.format(new BigDecimal(String.valueOf(rate))));
double num = 1.775;
BigDecimal bg = BigDecimal.valueOf(num);
System.out.println(bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());

 

你可能感兴趣的:(关于java四舍五入时遇五不进位的问题)