Java 浮点型(Double,Float)精度丢失解决方案

本文讲述了在处理微信支付退款时遇到的Java中浮点型(Double, Float)精度丢失问题,导致退款金额计算错误。排查过程包括检查退款记录和传参,最后发现是double类型计算时精度丢失造成的。精度丢失的原因是十进制与二进制转换的不精确。解决方案包括使用分作为单位存储和计算,或采用BigDecimal进行高精度计算。" 88888768,7242792,R语言绘制堆积条形图详解,"['R语言', '数据可视化', '图形绘制', '统计图表', '数据处理']
摘要由CSDN通过智能技术生成
前言

最近公司某小伙子做了一个商城的微信支付相关的接口,其中包含退款,在测试过程中发现部分单据没有退款,微信支付提示退款金额跟支付金额不匹配(大于支付金额),检查数据库和调试过程中,发现商品的单价和手工计算出来的总价是跟订单金额匹配的,实在无法确认问题原因最终bug转向我来排查,于是有了此文

排查

由于手工计算出来的金额跟实际支付的金额是能匹配上的,所以一开始我以为是订单已经进行了部分退款,再次全部退款的话肯定会被微信阻止,因为这样的话就会出现超退。

第一步:是否已经部分退款

去微信支付平台排查是否有退款,结果发现并没有退款

由于微信平台没有查询到此单的退款,那么说明不是超退的问题,可能是传入的订单金额有问题,但是大部分单据又可以退款,所以也暂时陷入了僵局,不过为了保险起见,还是去看了一下传参处

第二步:检查传参

检查微信退款方法传参时,看了传入参数,由于微信传参的单位是分,所以看到传参处传入退款总金额代码(int)(100)*商品单价*退货数量(这里只是伪代码,多个商品肯定还要相加计算的),粗略一看没有问题,仔细一看不对,总价是直接double类型的乘以数量在乘以100再强转为int类型传入的,按照理论上来说是没有问题的,因为我们商品价格都是精确到分的,但是只是理论上,实际上就是Java的double类型有个大坑(不只是Java,JavaScript,c#等很多语言都有这个问题)࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值