当前位置: 首页 > ops >正文

前端百分比展示导致后端 BigDecimal 转换异常的排查与解决

在开发一个订单预算系统时,我们需要在前端动态计算「利润率差额」,格式为百分比(带 % 符号)保留4位小数,但实际传给后端时必须是纯数字(浮点数),以便后端正常以 BigDecimal 类型接收并处理。

然而,我们在某次提交数据到后端时,系统直接抛出以下异常:

告诉我们传递的是null ,告诉我无法转换

问题分析

前端相关代码如下所示:

// 利润率差额 profitRateDiff(百分比 + % 符号,保留4位小数)
const orderRevenueActual = Number(this.costData.orderRevenueActual) || 0
let profitRateDiff = '0.0000%' // 👈 注意这里是字符串!
if (orderRevenueActual !== 0) {const rate = (netProfitDiff / orderRevenueActual) * 100profitRateDiff = `${rate.toFixed(4)}%`
}
this.$set(this.costData, 'profitRateDiff', profitRateDiff)

这段代码表面上看没毛病,逻辑严谨,结果也是正确显示出“28.4212%”这样格式化的字符串。

然而,致命问题在于:

👉 profitRateDiff 被直接设置为 字符串类型(带 %)
👉 最终提交接口时 this.costData.profitRateDiff 仍是字符串 "28.4212%"
👉 后端尝试将 "28.4212%" 转换为 BigDecimal,但 % 字符不是合法数字格式
👉 报错!

正确写法

1. 存值用数字,不要包含 % 字符,如果需要可以重新写个方法转过去

const orderRevenueActual = Number(this.costData.orderRevenueActual) || 0
let profitRateDiff = 0 // 👈 注意初始化为数字
if (orderRevenueActual !== 0) {const rate = (netProfitDiff / orderRevenueActual) * 100profitRateDiff = +rate.toFixed(4) // 强转为小数数字
}
this.$set(this.costData, 'profitRateDiff', profitRateDiff) // 仍是纯数字

比如:

methods: {formatPercent(value) {if (value == null || isNaN(value)) return '0.0000%'return value.toFixed(4) + '%'}
}

最佳实践总结

需求实现方式
存储使用数字 28.4212
展示格式化显示为 28.4212%
提交后端保证 costData.profitRateDiff 是数字类型

写在最后

这次坑给我们的经验是:

  • 前端显示归显示,存储归存储,一定要分离

  • 在与后端协作中,要严格约定字段类型:数字就是数字、字符串就是字符串

  • 对格式化展示的字段,尽量使用计算属性、方法或者过滤器处理,而不要将格式化后的值直接赋值到数据模型中

http://www.xdnf.cn/news/17172.html

相关文章:

  • 【数据库】如何从本地电脑连接服务器上的MySQL数据库?
  • 第二集 测试概念
  • 3a服务器的基本功能1之身份认证
  • 【ee类保研面试】数学类---概率论
  • 嵌入式硬件学习(十一)—— platform驱动框架
  • 基于 HT 引擎实现 3D 智慧物流转运中心一体化管控系统
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的用户留存策略研究
  • 计算机基础·linux系统
  • 解决Git提交人信息默认全局化问题:让提交人自动关联当前用户
  • 阿里云部署若依后,浏览器能正常访问,但是apifox和小程序访问后报错链接被重置
  • 【保姆级喂饭教程】python基于mysql-connector-python的数据库操作通用封装类(连接池版)
  • 动态代理常用的两种方式?
  • 大疆无人机使用eport连接Jetson主板实现目标检测
  • 异构系统数据集成之数据源管理:打通企业数据孤岛的关键一步
  • TDengine IDMP 背后的技术三问:目录、标准与情景
  • ​ubuntu22.04系统入门 (四)linux入门命令 权限管理、ACL权限、管道与重定向
  • 思途AOP学习笔记 0806
  • day20|学习前端
  • 比特币量化模型高级因子筛选与信号生成报告
  • 数据大集网:以数据为纽带,重构企业贷获客生态的助贷平台实践
  • 重生之我在暑假学习微服务第十一天《配置篇》+网关篇错误订正
  • 【图像处理基石】什么是数字高程模型?如何使用数字高程模型?
  • HarmonyOS应用开发环境搭建以及快速入门介绍
  • Diamond基础1:认识Lattice器件
  • 【LeetCode 热题 100】347. 前 K 个高频元素——(解法三)桶排序
  • 接口——串口uart(485)
  • 常用排序方法
  • LeetCode 面试经典 150_数组/字符串_O(1)时间插入、删除和获取随机元素(12_380_C++_中等)(哈希表)
  • Java throw exception时需要重点关注的事情!
  • 项目中MySQL遇到的索引失效的问题