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

问题描述

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

解决过程

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

out_trade_no必选string(64)
【描述】商户订单号。
由商家自定义,64个字符以内,仅支持字母、数字、下划线且需保证在商户端不重复。
【示例值】20150320010101001

total_amount必选price(11)
【描述】订单总金额,单位为元,精确到小数点后两位,取值范围为 [0.01,100000000]。金额不能为0。
【示例值】88.88
subject必选string(256)

【描述】订单标题。
注意:不可使用特殊字符,如 /=& 等。
【示例值】Iphone6 16G

product_code必选string(64)
【描述】销售产品码,与支付宝签约的产品码名称。注:目前电脑支付场景下仅支持FAST_INSTANT_TRADE_PAY
【示例值】FAST_INSTANT_TRADE_PAY

time_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);
            // 生成订单info
            OrderVo 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:
在这里插入图片描述

总结:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React+TS前台项目实战(十二)-- 全局常用组件Toast封装,以及rxjs和useReducer的使用

文章目录 前言Toast组件1. 功能分析2. 代码详细注释&#xff08;1&#xff09;建立一个reducer.ts文件&#xff0c;用于管理状态数据&#xff08;2&#xff09;自定义一个清除定时器的hook&#xff08;3&#xff09;使用rxjs封装全局变量管理hook&#xff08;4&#xff09;在to…

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日22点50分 &#x1f004;️文章质量&#xff…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…

【vue大作业-端午节主题网站】【预览展示视频和详细文档】

vue大作业-端午节主题网站介绍 端午节&#xff0c;又称为龙舟节&#xff0c;是中国的传统节日之一&#xff0c;每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子&#xff0c;也是家人团聚、共享美食的时刻。今天&#xff0c;我们非常高兴地分享一个以端午节为…

建筑学跑路:揭秘热门转行新选择!

话说建筑学真的是我见过最关心同行的专业&#xff0c;每个建筑学跑路的帖子下面都有人问&#xff1a;你跑哪里去了&#xff1f; 很多人表示&#xff0c;我也想跑 当然不仅建筑学&#xff0c;园林的、城规的、土木的也会来凑热闹&#xff1a; 很多小伙伴分享了自己的转行经历&a…

用这个神级提示词插件,能让你的AI绘画工具Stable diffusion提示词直接写中文!

大家好&#xff0c;我是设计师阿威 最近&#xff0c;有同学在使用AI绘画工具 Stable Diffusion的时候和我说&#xff1a;老师&#xff0c;我英文不好&#xff0c;能不能直接让我写中文提示词啊&#xff1f;最好可以直接在SD的输入框就能直接写中文&#xff0c;不用切换网页或者…

哪个充电宝牌子好用又实惠?盘点四大平价充电宝分享

在当今快节奏的生活中&#xff0c;充电宝已成为我们日常生活中不可或缺的一部分。然而&#xff0c;面对市场上琳琅满目的充电宝品牌和型号&#xff0c;许多消费者误以为选择容量越大、价格越高的充电宝就是最好的选择。实际上&#xff0c;买充电宝并不是一味追求高容量和高价格…

好用的加密软件谁在用啊?不会吧,还不知道迅软DSE加密软件好用?

说起加密软件想必大家都不陌生&#xff0c;就是用来保护机密数据的&#xff0c;防止泄密行为的出现&#xff0c;那么重点来了&#xff0c;想要完全的把机密信息保护起来&#xff0c;那就用到了加密软件&#xff0c;需要选择一款靠谱、有效果的加密软件才能实现加密&#xff0c;…

2024信息系统、信号处理与通信技术国际会议(ICISPCT2024)

2024信息系统、信号处理与通信技术国际会议&#xff08;ICISPCT2024) 会议简介 2024国际信息系统、信号处理与通信技术大会&#xff08;ICISPCT2024&#xff09;将在青岛隆重开幕。本次会议旨在汇聚全球信息系统、信号处理和通信技术领域的专家学者&#xff0c;共同探索行业…

希尔排序-C语言版本

前言 从希尔开始&#xff0c;排序的速度就开始上升了&#xff0c;这里的排序开始上一个难度了&#xff0c;当然难一点的排序其实也不是很难&#xff0c;当你对于插入排序了解的足够深入的时候&#xff0c;你会发现其实希尔就是插入的异形&#xff0c;但是本质上还是一样的 希尔…

解决linux下载github项目下载不下来,下载失败, 连接失败的问题

第一步&#xff1a;打开/etc/hosts文件 linux vim /etc/hosts 第二步&#xff1a;文件拉到最下面&#xff0c;输入以下内容 linux #GitHub Start 140.82.113.3 github.com 140.82.114.20 gist.github.com 151.101.184.133 assets-cdn.github.com 151.101.184.133 raw.githubus…

在有限的分数有限下如何抉择?是选好专业还是选好学校

随着2024年高考的落幕&#xff0c;无数考生和家长站在了人生的重要十字路口。面对成绩单上的数字&#xff0c;一个难题摆在了面前&#xff1a;在分数限制下我们该如何平衡“心仪的专业”与“知名度更高的学校”之间的选择&#xff1f; 一、专业决定未来职业走向 选择一个好的专…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后&#xff0c;需要进行初始化数据库操作&#xff0c;对应PostgreSQL数据库中就是需要进行initdb后&#xff0c;才能对数据库进行启动。initdb的过程&#xff0c;其实就是创建数据库实例的过程&#xff0c;生成模板数据库和相应的目录、文件信息&a…

vue大作业-端午节主题网站

vue大作业-端午节主题网站介绍 端午节&#xff0c;又称为龙舟节&#xff0c;是中国的传统节日之一&#xff0c;每年农历五月初五庆祝。这个节日不仅是纪念古代爱国诗人屈原的日子&#xff0c;也是家人团聚、共享美食的时刻。今天&#xff0c;我们非常高兴地分享一个以端午节为…

如何完美解决 Oracle Database 19c 安装程序 - 第7步(共8步)卡住,半小时都不动

&#x1f680; 如何完美解决 Oracle Database 19c 安装程序 - 第7步&#xff08;共8步&#xff09;卡住&#xff0c;半小时都不动 摘要 在安装 Oracle Database 19c 时&#xff0c;很多用户会在第7步&#xff08;共8步&#xff09;遇到卡住的问题&#xff0c;尤其是安装程序长…

【html】用html5+css3+JavaScript制作一个计数器

目录 简介&#xff1a; 效果图&#xff1a; 源码&#xff1a; html: CSS: JS: 源码解析&#xff1a; 简介&#xff1a; 在日常生活当中很多事情都需要用到计数器特别是在体育运动当中&#xff0c;可以我们那么我们可不可以通过网页来制作一个计数器呢答案是肯定的我们需要利…

【Python】Redis数据库

Redis数据库 Unit01一、Redis1.1 概述1.2 安装1.3 Redis-cli1.4 数据类型1.5 字符处理1.6 键的命名规则 二、通用命令三、字符串(String)3.1 概述3.2 常用命令3.3 应用场景 四、列表(List)4.1 概述4.2 常用命令 五、集合(SET)5.1 概述5.3 常用命令 六、有序集合6.1 概述6.2 常用…

智慧养老,乐享晚年 — 探索新时代的养老模式

​随着科技的飞速发展和人口老龄化趋势的加剧&#xff0c;传统的养老模式已经无法满足现代社会的需求。人们期待在晚年能够享受到更加智能、便捷、舒适的生活。智慧养老&#xff0c;作为一种融合现代科技与养老服务的新型模式&#xff0c;正逐渐成为时代的选择&#xff0c;为老…