前几天做了一个汇率换算的相关项目,汇率从已有的Service读取,类型是Float。 啥也没想,直接转换为BigDecimal,换算,rounding,commit...呵呵 过了一会,Tester说,汇率换算不对,有bug,rounding不对! 在Java中,如果直接用BigDecimal.valueOf(0.5f),JDK会自动把Float转换为Double, 问题来了,为了保持精度,你所得到的Double并不是你想象中的那样,比如: double a = (double)0.5f, 这个时侯a是0.5 double b = (double)0.00005f, 这个时侯b是0.00004999999873689376 或者 4.999999873689376E-5 如果这时,你想换算VND to USD, BigDecimal.valueOf(0.00005f).multiply(BigDecimal.valueOf(10000000000L)) rounding以后,你得到的是499999.987 问题就在float to BigDecimal 的时侯JDK自动帮你转换为Double How to fix? 根据JDK文档, BigDecimal exchangeRate = new BigDecimal(Float.toString(0.00005f)); exchangeRate.multiply(BigDecimal.valueOf(10000000000L)) 这是,你得到的值就是500000 [ 本帖最后由 ala 于 2011-3-30 21:08 编辑 ] |