我的小数哪里去了?

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

 /**
* 元转换成分 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 请告知哈。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值