关于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());

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值