最近在用财付通做分账,其中要将元转换为分,财付通的工具类中提供了一个方法:
系统上线一段时间支付都没问题,但是今天突然有一笔订单提示分账金额不对,我就奇怪了,用了将近1个月,业务也没改过,怎么会有问题呢?经过断点跟踪,发现只要将数据1077.1传递进去,最后结果就会默默的变成107709。继续跟踪方法,结果出来了:1077.1*100之后的结果就变成 107709.99999999999。
百思不得其解,问财付通的技术员,他们也无法解释。最后没办法,只好自己改了:
这样就OK了,如果有谁知道 为什么double类型的1077.1乘以100会变成107709.99999999999 请告知哈。。
/**
* 元转换成分 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 请告知哈。。