精度丢失引起的支付失败问题

问题描述

在提交订单时候,输入充值金额和优惠码,后台会返回具体的订单信息,如下图,支付金额应该是1 * (1 - 0.09) = 0.91(这个是理想状态),但是表单显示的是0.90999997,
在这里插入图片描述
然后点击确认的时候,它会进行支付请求,最终报错如下,错误表达就是参数无效
在这里插入图片描述

解决过程

去支付宝沙箱官网看参数设置,主要是下面这五个参数

out_trade_no必选string(64)
【描述】商户订单号。
由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。
【示例值】20150320010101001total_amount必选price(11)
【描述】订单总金额,单位为元,精确到小数点后两位,取值范围为 [0.01,100000000]。金额不能为0。
【示例值】88.88
subject必选string(256)【描述】订单标题。
注意:不可使用特殊字符,如 /=& 等。
【示例值】Iphone6 16Gproduct_code必选string(64)
【描述】销售产品码,与支付宝签约的产品码名称。注:目前电脑支付场景下仅支持FAST_INSTANT_TRADE_PAY
【示例值】FAST_INSTANT_TRADE_PAYtime_expire可选string(32)
【描述】订单绝对超时时间。
格式为yyyy-MM-dd HH:mm:ss。超时时间范围:1m~15d。
注:time_expire和timeout_express两者只需传入一个或者都不传,两者均传入时,优先使用time_expire。
【示例值】2016-12-31 10:05:01

其中total_amount这个参数它要求精确到小数点后两位,再看我订单返回的值是0.90999997,就是这个参数导致支付失败

精度丢失说明:

浮点数精度丢失问题源于计算机如何表示和处理浮点数。计算机内部使用二进制(base-2)系统表示数字,而某些十进制小数无法被精确地表示为二进制小数。这导致在浮点数运算过程中出现精度丢失问题。

验证示例如下:

在这里插入图片描述

解决方法

使用BigDecimal

public OrderVo returnOrderInfo(Long uid, Long amount, String codes) {if(codes != null && (codes.length() != 49 || (codes.charAt(codes.length() - 1) != '0' && codes.charAt(codes.length() - 1) != '1'))){throw new RuntimeException("优惠码格式错误");}try{Float discountRate = null;BigDecimal realAmount = null;BigDecimal amounts = new BigDecimal(amount.toString());if(StringUtils.isNoneBlank(codes)){// 校验优惠码BaseResponse<PromotionVo> baseResponse = orderPromotionFeign.checkPromotionCode(uid, codes);if(baseResponse.getCode() != 0){throw new RuntimeException("优惠码不可用");}discountRate = baseResponse.getData().getDiscountRate();}if(discountRate == null){realAmount = amounts;}else {BigDecimal discount = new BigDecimal(discountRate.toString());realAmount = amounts.multiply(BigDecimal.ONE.subtract(discount));}realAmount = realAmount.setScale(2, BigDecimal.ROUND_HALF_UP);// 生成订单infoOrderVo orderVo = OrderVo.builder().subject("购买憨币").amount(amount).realAmount(realAmount.floatValue()).discountRate(discountRate).codes(codes).build();log.info("订单信息:{}", orderVo);return orderVo;}catch (Exception e){throw new RuntimeException("获取订单信息失败");}}

*注,在使用BigDecimal的时候,使用字符串构造 BigDecimal,不然还会引起精度问题,如下:

在这里插入图片描述

使用字符串构造 BigDecimal,就不会出现精度丢失问题:

在这里插入图片描述

总结:

在本文中,我分享了一个关于在线支付过程中遇到的精度丢失问题及其解决方案。用户在提交订单时,由于后台计算的支付金额存在精度问题,导致支付宝支付请求失败,并返回了INVALID_PARAMETER错误码。这个问题的根本原因在于浮点数在计算机中的表示方式,即二进制系统与十进制小数的不完全对应,这在金融计算中尤为关键。
为了解决这一问题,我提出了使用BigDecimal类来处理所有货币相关的计算。BigDecimal提供了更高精度的十进制运算能力,可以有效避免浮点数运算中的精度丢失。在示例代码中,我展示了如何使用BigDecimal进行精确的金额计算,并通过setScale方法设置小数点后两位,使用ROUND_HALF_UP参数进行四舍五入,以确保金额的准确性。
文章最后,指出了在使用BigDecimal时的最佳实践:应通过字符串构造器来创建BigDecimal实例,以避免直接使用数值构造时可能引起的精度问题。
总结来说,本文提供了一个实用的解决方案,帮助开发者在设计和实现涉及金钱的系统时,能够避免因浮点数精度问题导致的支付失败。通过使用BigDecimal,我们可以确保金额计算的准确性,从而提高系统的可靠性和用户的信任度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构师篇-1、总体架构设计

业务架构哲学本质 定位&#xff1a;赋予业务架构设计能力&#xff0c;具备业务架构设计思维模型&#xff0c;掌握业务架构哲学本质&#xff0c;形成以不变应万变的业务架构设计能力。 架构师所需要的能力&#xff1a; 带领业务成功通过框架思维赋能业务架构师知识体系构建掌…

HDU——2090.算菜价、2091.空心三角形、2093.考试排名

2090.算菜价 题目描述 Problem - 2090 Problem Description 妈妈每天都要出去买菜&#xff0c;但是回来后&#xff0c;兜里的钱也懒得数一数&#xff0c;到底花了多少钱真是一笔糊涂帐。现在好了&#xff0c;作为好儿子&#xff08;女儿&#xff09;的你可以给她用程序算一…

Adobe XD是否收费?试试这几款超值的免费软件吧!

Adobe XD是一站式的 UX/UI 设计平台&#xff0c;设计师可以使用Adobe XD完成移动应用app界面设计、网页设计、原型设计等。Adobe XD也是一款结合原型和设计&#xff0c;提供工业性能的跨平台设计产品。而Adobebe。 XD跨平台的特点得到了很好的弥补 Sketch 没有 Windows 版本的缺…

网安人必备!开源网络安全工具TOP 10(附下载地址)

工欲善其事&#xff0c;必先利其器。对于广大的网络安全从业者&#xff0c;以及未来想要从事网络安全的人来说&#xff0c;选择并善用合适的网络安全工具&#xff0c;能有效提升工作效率。 开源网络安全工具之所以能够在众多安全解决方案中脱颖而出&#xff0c;不仅是因为它们…

C++ 68 之 类模版作函数的参数

#include <iostream> // #include <cstring> #include <string> using namespace std;template<class T1, class T2> // 可以设置默认的类型值&#xff0c;后面在使用的时候&#xff0c;就不用再指定类型了 class Students08{ public:T1 m_name;T2 m_a…

SysTools MailXaminer: 电子邮件取证调查中的链接分析和时间线分析

天津鸿萌科贸发展有限公司是 SysTools 系列软件的授权代理商。 SysTools MailXaminer 电子邮件取证软件提供全面强大的解决方案&#xff0c;通过简化的操作&#xff0c;从电子邮件客户端、网络邮箱服务器、磁盘镜像、Skype 通讯工具中解密并搜索证据。软件对调查工作的每一阶段…

c++参考std::string自己设计类hstring

目录 一、前言 二、设计需求 三、设计思想 1.功能一 1.功能二 四、设计过程 1.类hstring搭建 2. 实现有参构造函数 3. 实现副本构造函数 4.完整代码 五、结束语 一、前言 在c中有很多的库&#xff0c;但是在有些时候呢&#xff0c;我们一定要学会自己去设计库&#…

文件扫描工具都有哪些?职场大佬都在用的文本提取工具大盘点~

回想起刚毕业初入职场那阵子&#xff0c;领导让帮忙把纸质文件扫描提取为文本时&#xff0c;还只会傻乎乎地一点点操作&#xff0c;属实是费劲得很&#xff01; 好在后面受朋友安利&#xff0c;找到了4个能够快速实现文件扫描文字提取的方法&#xff0c;这才让我的办公效率蹭蹭…

关于自学\跳槽\转行做网络安全行业的一些建议

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#xff0c;发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答&#…

MyBatis-For input string: “oqm“ 异常

前言 具体的异常信息如下&#xff1a; Error attempting to get column open_id from result set. Cause: java.lang.NumberFormatException: For input string: "oqmJX5ZPU1KOv-YDt30GNAN-Zefk" 乍一看下其实就是无法把open_id字符串类型转为数字类型进行赋值&…

synchronized原理

当线程释放锁&#xff0c;JMM会把线程对应的本地的内存中的共享变量刷新到内存中 当线程获取锁&#xff0c;JMM会帮其他线程中对应的本地的内存中的共享变量设置未无效&#xff0c;从而监视器保护的临界区的代码必须从内存中读取共享变量。&#xff08;临界区为锁之间的代码&am…

3D模型可视化引擎HOOPS Communicator与Visualize的统一化文件加载解决方案

在当今数字化时代&#xff0c;3D可视化技术已成为工程设计、建筑规划和游戏开发等多个领域的核心技术。Tech Soft 3D公司凭借其创新的HOOPS Communicator和HOOPS Visualize两款开发包&#xff0c;分别针对Web端和桌面端提供了强大的3D可视化解决方案。然而&#xff0c;由于两者…

第三集《唯识与净土》

和尚尼慈悲&#xff01;诸位法师、诸位居士&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义第六面&#xff0c;三、业果强弱。 我们身为一个有情众生&#xff0c;在我们的生命当中&#xff0c;我们曾经出现过很多痛苦的果报&#xff0c;当然也出现过很多安乐的果报&#xff0…

c语言回顾-结构体(2)

前言 前面讲了结构体的概念&#xff0c;定义&#xff0c;赋值&#xff0c;访问等知识&#xff0c;本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段&#xff0c;话不多说&#xff0c;直接上干货&#xff01;&#xff01;&#xff01; 1.结构体内存对齐 说到计…

物联网技术-第3章物联网感知技术-3.2定位技术

目录 1.1位置信息和位置服务 1.1.1位置信息 1.1.2位置服务 1.2主流定位系统 1.2.1卫星定位系统&#xff08;Satellite Positioning Systems&#xff09; 1.2.2移动通信蜂窝基站定位&#xff08;Cellular Triangulation or Advanced Forward Link Trilateration&#xff09…

大学物理绪论组收集和分析

目录 ​编辑 随机误差的估计 算术平均值的标准偏差 不确定度&#xff08;Uncertainty&#xff09;是测量学中的一个重要概念&#xff0c;用于表示测量结果的可靠程度。它反映了测量值可能偏离真值&#xff08;即被测量的客观真实值&#xff09;的程度。 A类不确定度的计算方…

健身小程序:智能化助力个人健身旅程

一、智能化功能的核心 健身小程序的智能化功能主要体现在以下几个方面&#xff1a; 智能健身计划推荐&#xff1a;小程序内置了先进的算法&#xff0c;能够根据用户的身体状况、健身目标和时间安排&#xff0c;智能推荐个性化的健身计划。这些计划不仅科学合理&#xff0c;而且…

ThreeJS-截屏下载pdf或者图片时白屏

JS-页面截图下载为pdf 关于如何下载为 pdf 在上面的这篇文章中有写&#xff0c;大家可以看下&#xff0c;下载图片代码在最下面 这时我们发现 three 部分是空白的如下&#xff1a; 这就多少有点尴尬了&#xff0c;这时我们习惯性的看下后台报错 是不是发现了惊喜&#xff0c;…

足底筋膜炎怎么治疗效果好得快

足底筋膜炎症状&#xff1a;疼痛是足底筋膜炎最典型和常见的症状。患者通常会感到足跟或足底区域的疼痛&#xff0c;这种疼痛可能表现为刺痛、钝痛或灼热感。疼痛的程度和频率因人而异&#xff0c;但通常会在早晨起床后或长时间休息后首次站立时最为明显。这是因为休息时足底筋…

eclipse宝刀未老

Theia 是一个高度可定制的、开源的、基于 Web 的集成开发环境&#xff08;IDE&#xff09;框架。它由 Eclipse Foundation 主导&#xff0c;旨在为云和本地环境提供现代化的、全功能的 IDE 解决方案。Theia 的核心目标是提供一个灵活的平台&#xff0c;开发者可以根据自己的需求…