我的小数哪里去了?

最近在用财付通做分账,其中要将元转换为分,财付通的工具类中提供了一个方法:

 /**
  * 元转换成分 1元==100分
  * 对于0.011元转换成为1分,小数点后面第3位以后的(包含第三位)将舍弃.
  * @param money
  * @return long
  */
 public static long yuan2Fen(double money) {  
  String strFen = (money *  Double.valueOf(100)) + "";

  return Long.parseLong(strFen.substring(0,strFen.indexOf(".")));

 }
 



系统上线一段时间支付都没问题,但是今天突然有一笔订单提示分账金额不对,我就奇怪了,用了将近1个月,业务也没改过,怎么会有问题呢?经过断点跟踪,发现只要将数据1077.1传递进去,最后结果就会默默的变成107709。继续跟踪方法,结果出来了:1077.1*100之后的结果就变成 107709.99999999999。

百思不得其解,问财付通的技术员,他们也无法解释。最后没办法,只好自己改了:
  public static long yuan2Fen(double money) { 
  BigDecimal   b1   =   new   BigDecimal(Double.toString(money));   
  BigDecimal   b2   =   new   BigDecimal(Double.toString(100));    
  String strFen =  b1.subtract(b2).doubleValue()+ "";

  return Long.parseLong(strFen.substring(0,strFen.indexOf(".")));

 }


这样就OK了,如果有谁知道 为什么double类型的1077.1乘以100会变成107709.99999999999 请告知哈。。

你可能感兴趣的:(我的小数哪里去了?)