关于java四舍五入的问题

之前碰到一个java四舍五入的问题,这个问题一直没有找到好的答案,今天总算弄明白了。
问题如下:
double f1 = new BigDecimal(0.00251231212).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
或者
double f1 = new BigDecimal(“0.00251231212”).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();

f1的输出结果是:0.0030
请问为什么不是0.003?有什么办法使其返回的结果是0.003?

回答:当输出f1的时候,print方法会调用String.valueof(Double x), 实际上都是转成string了,所以理论上不是string的对象,打印都要格式化,除非你不在乎。
可以如此格式化:
System.out.println(MessageFormat.format("{0,number,#.###}",f1));

精度问题可以运行如下代码:
double val = 0;
for (int i = 0; i < 10; i++) {
val += 0.1;
System.out.println(val);
}

     
BigDecimal feeAmountBigDecimal = new BigDecimal("17.83");
BigDecimal unitBigDecimal = new BigDecimal("100");
BigDecimal amount = feeAmountBigDecimal.multiply(unitBigDecimal);
//whose scale is {@code (this.scale() + multiplicand.scale())}

System.out.println(amount); //1783.00
System.out.println(17.83*100); //1782.9999999999998
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值