news 2026/3/29 3:58:45

Vue el-table 表尾合计行

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue el-table 表尾合计行
问题:

前端在处理后端接口返回的列表数据进行表尾合计行统计,由于返回的金额不固定,有小数,整数,大数值等等,会出现累计计算数值精度丢失的问题,导致页面数据看起来是错的。

原因:

在JavaScript中,Number.MAX_SAFE_INTEGER是一个常量,其值为9007199254740991(2^53 - 1),代表JavaScript中可以安全表示的最大整数。这意味着任何大于Number.MAX_SAFE_INTEGER的整数在进行数学运算时可能会失去精度,因为JavaScript使用IEEE 754标准的64位浮点数表示数字,其中包括一个符号位、11位指数位和52位尾数位。

重写el-table 表尾合计行方法:
<template> <div class="table-container"> <el-table :data="tableData" show-summary :summary-method="getSummaries" style="width: 100%"> <el-table-column prop="id" label="ID" width="120"></el-table-column> <el-table-column prop="month" label="月份" width="120"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="amount1" label="整数金额" width="120"></el-table-column> <el-table-column prop="amount2" label="小数金额" width="120"></el-table-column> <el-table-column prop="amount3" label="混合金额" width="200"></el-table-column> </el-table> </div> </template> <script> export default { name: 'TableComponent', data() { return { tableData: [ { id: '12987122', month: '2026-02', name: '王小虎', amount1: '234', amount2: '3.2', amount3: '0.11' }, { id: '12987123', month: '2026-01', name: '王小虎', amount1: '165', amount2: '4.43', amount3: '0.88' }, { id: '12987124', month: '2025-12', name: '王小虎', amount1: '324', amount2: '1.9', amount3: '2' }, { id: '12987125', month: '2025-11', name: '王小虎', amount1: '621', amount2: '2.2', amount3: '123456789123456789' }, { id: '12987126', month: '2025-10', name: '王小虎', amount1: '539', amount2: '4.1', amount3: '887654321987654321' } ] }; }, methods: { getSummaries(param) { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = '合计'; return; } const values = data.map(item => Number(item[column.property])); if (column.property === 'amount3') { // 对amount3字段进行高精度计算 const total = this.calculateHighPrecisionSum(data.map(item => item.amount3)); sums[index] = total; } else if (!values.every(value => isNaN(value))) { const precisions = []; let notNumber = true; values.forEach(value => { if (!isNaN(value)) { notNumber = false; const decimal = value.toString().split('.')[1]; precisions.push(decimal ? decimal.length : 0); } }); if (!notNumber) { const precision = Math.max(...precisions); sums[index] = values.reduce((prev, curr) => { const value = Number(curr); if (!isNaN(value)) { return parseFloat((prev + value).toFixed(Math.min(precision, 20))); } else { return prev; } }, 0); } else { sums[index] = 'N/A'; } } else { sums[index] = 'N/A'; } }); return sums; }, // 高精度计算方法,处理大数和小数的精确相加 calculateHighPrecisionSum(amounts) { if (!amounts || amounts.length === 0) return '0'; // 使用数组来存储每一位数字,从低位到高位 let result = []; let maxDecimalPlaces = 0; // 先确定最大的小数位数 amounts.forEach(amount => { const parts = amount.split('.'); if (parts.length > 1) { maxDecimalPlaces = Math.max(maxDecimalPlaces, parts[1].length); } }); // 将所有数字转换为整数进行计算(乘以10^maxDecimalPlaces) const integers = amounts.map(amount => { const parts = amount.split('.'); let integerPart = parts[0]; let decimalPart = parts[1] || ''; // 补齐小数位 while (decimalPart.length < maxDecimalPlaces) { decimalPart += '0'; } return integerPart + decimalPart; }); // 从右到左逐位相加 let carry = 0; let maxLength = Math.max(...integers.map(num => num.length)); // 补齐位数 for (let i = 0; i < integers.length; i++) { while (integers[i].length < maxLength) { integers[i] = '0' + integers[i]; } } // 逐位相加 for (let i = maxLength - 1; i >= 0; i--) { let sum = carry; for (let j = 0; j < integers.length; j++) { sum += parseInt(integers[j][i] || '0'); } result.unshift(sum % 10); carry = Math.floor(sum / 10); } // 处理最后的进位 while (carry > 0) { result.unshift(carry % 10); carry = Math.floor(carry / 10); } // 转换回小数形式 let resultStr = result.join(''); // 如果需要小数点,插入小数点 if (maxDecimalPlaces > 0) { if (resultStr.length <= maxDecimalPlaces) { // 如果结果长度小于小数位数,前面补0 while (resultStr.length < maxDecimalPlaces + 1) { resultStr = '0' + resultStr; } } const decimalIndex = resultStr.length - maxDecimalPlaces; resultStr = resultStr.substring(0, decimalIndex) + '.' + resultStr.substring(decimalIndex); // 去除末尾多余的0 resultStr = resultStr.replace(/\.?0+$/, ''); // 如果小数点在最后,去掉小数点 resultStr = resultStr.replace(/\.$/, ''); } // 去除开头的0(但保留至少一个数字) // 页面eslint校验报错可删除 resultStr = resultStr.replace(/+/, '') || '0'; return resultStr; } } }; </script> <style scoped> .table-container { padding: 20px; background-color: #fff; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); } </style>
代码逻辑说明:
  1. 实现了Vue.js环境下的表格组件,包含表尾合计行功能
  2. 针对混合金额字段amount3,实现了高精度计算方法,支持小数、整数和大数的精确相加
  3. 使用字符串操作和逐位计算的方式,确保大数计算时不会丢失精度
  4. 合计计算从数值的最后面往前一步步计算,保证计算准确性
  5. 返回总金额的字符串格式,保持原始数据的精度特征
  6. 包含完整的样式设计,提供现代化的UI界面

记录一下,有好的方法可以评论区说说~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 12:51:36

面试-Tokenizer训练

1 代码 # 注&#xff1a;不建议再重复训练tokenizer&#xff08;“词典”&#xff09;&#xff0c;MiniMind已自带&#xff0c;此脚本仅供学习和参考。基于不同词典训练的模型将导致输出完全不统一&#xff0c;降低社区的模型复用性 # Note: It is not recommended to re-train…

作者头像 李华
网站建设 2026/3/27 11:24:25

2026.2.3

进入社会已两年有余&#xff0c;生活与工作都算稳定下来。这两年&#xff0c;我实践着学生时代的梦想&#xff0c;走进真实的企业项目&#xff0c;触摸了从需求、设计、开发到上线的完整链条&#xff0c;也体味了团队协作中的碰撞与默契。如今&#xff0c;我对“项目”二字有了…

作者头像 李华
网站建设 2026/3/26 20:34:18

分发安卓证书在线生成:一键搞定应用签名,安全便捷有保障

发现了个特别好用的证书生成网站&#xff0c;大家可以看看第一步点击工具箱&#xff0c;点击安卓证书在线生成点击工具箱&#xff0c;点击安卓证书在线生成进入安卓证书在线生成页面第二步输入生成证书的相关要素第二步输入生成证书的相关要素第三步生成的证书文件&#xff0c;…

作者头像 李华
网站建设 2026/3/13 7:18:20

基于数万次真机评测,RoboChallenge 首份年度报告发布

Datawhale分享 年度报告&#xff1a;RoboChallenge当大语言模型在数字世界不断刷新人类认知边界&#xff0c;一场关于 AI 如何“扎根”现实物理世界的革命正悄然进行。今日&#xff0c;全球首个具身智能大规模真机评测平台—— RoboChallenge 正式发布首份年度报告。报告基于过…

作者头像 李华
网站建设 2026/3/27 22:25:14

马斯克旗下太空探索公司SpaceX合并xAI:前者估值1.5万亿美元

雷递网 乐天 2月3日太空探索公司SpaceX (SPAX.PVT)日前发布公告称&#xff0c;将于xAI (XAAI.PVT)合并&#xff0c;此次交易将整合埃隆马斯克旗下两家最大的私人创业公司。“SpaceX收购xAI&#xff0c;旨在打造地球上&#xff08;乃至太空&#xff09;最具雄心、垂直整合程度最…

作者头像 李华
网站建设 2026/3/27 6:07:49

跨国企业在中国月报 | 联合利华、先正达、默克、奥乐齐、星巴克、达美乐、Visa等公司动态

2026年1月份&#xff0c;跨国企业在中国的发展动态。先正达集团在中国加速布局全球级研发中心和制造工厂 今年1月&#xff0c;先正达集团全球植保中国创新中心在上海金山区正式启动建设。该中心被定位为先正达集团在全球布局的植保研发体系的重要组成部分&#xff0c;与现有的瑞…

作者头像 李华