element ui前端小数计算精度丢失的问题如何解决?

文章目录

  • 前言
  • 一、什么是精度丢失?
    • 产生精度丢失的原因
    • 如何避免或减少精度丢失的影响
  • 二、实际项目开发实例举例
    • 以项目预算模块为例
    • 如何解决精度丢失
  • 总结


前言

在《工程投标项目管理系统》项目开发中工程项目预算、成本管理、财务管理等模块的开发中不可避免的要和金融数字打交道,数字的计算 vue 总是出现精度丢失的困惑,解决这个问题其实很简单,有条件的同学可以自己封装函数,没有条件的同学懒人就用懒方法。小编虽懒,使用高人封装的decimal.js方法,爽的一逼,节约时间用于陪女朋友去喝咖啡何乐而不美🌹🤣🌹🤣🌹


一、什么是精度丢失?

  • 在计算机中,小数是以二进制的形式存储的。有些十进制小数无法精确地转换为二进制小数,在进行数值计算时就会产生精度丢失的问题。例如,十进制的 0.1 在二进制中是一个无限循环小数。在计算机内存中,由于存储位数的限制,只能近似地表示这个数,这就导致了精度的损失。
    当进行多个小数的运算,如加法、减法、乘法、除法等操作时,这种精度误差可能会累积,从而使最终结果与预期的数学精确结果产生偏差。

产生精度丢失的原因

1、二进制与十进制的转换问题
计算机底层是基于二进制进行数据存储和运算的。像十进制的分数1/3在十进制下是无限循环小数,同样,有些十进制小数在转换为二进制时也是无限循环小数。以为例,将其转换为二进制的计算过程如下:

  • 0.1x2=0.2 整数部分为0;
  • 0.2x2=0.4 整数部分为0;
  • 0.4x2=0.8 整数部分为0;
  • 0.8x2=1.6 整数部分为1;
  • 0.6x2=1.2 整数部分为1;

以此类推,会发现转换为二进制是,是一个无限循环小数。计算机在存储时如果只能保留有限的位数,就会产生精度误差。
2、浮点数的存储格式限制
计算机中常用的浮点数(如单精度浮点数和双精度浮点数)有其特定的存储格式。以 IEEE 754 标准的单精度浮点数为例,它用 32 位来存储一个浮点数,其中包括 1 位符号位、8 位指数位和 23 位尾数位。这种有限的位数限制了能够精确表示的数值范围和精度。
例如,当两个非常接近的小数相减时,由于浮点数的精度限制,可能会得到不准确的结果。假设,,在理论上,但在计算机中由于精度问题,可能会得到一个略微偏离这个值的结果。

如何避免或减少精度丢失的影响

1、使用高精度计算库
对于一些对精度要求极高的计算场景,如金融计算等,可以使用高精度计算库。
2、适当的数值缩放
在一些情况下,可以通过适当的数值缩放来减少精度丢失的影响。例如,在处理货币金额时,如果金额单位是元,可以将其转换为分来进行计算。这样就可以使用整数进行计算,避免了小数计算带来的精度问题。
3、误差范围判断
对于一些不要求绝对精确,但要求在合理误差范围内的计算,可以设定一个允许的误差范围。
例如,当比较两个浮点数是否相等时,不直接使用a==b,而是判断|a-b|<e,其中e是一个很小的允许误差值,如 1e-9。

二、实际项目开发实例举例

以项目预算模块为例

项目的预算一般分为名称、规格、单价、数量,总价即为单价和数量相乘的鸡,别管什么丫,下面截图不难看出计算结果,无限接近实际值,近在咫尺永恒于咫尺,这就纳闷,(´・_・`) 会计看见就会懵圈,我单位的会计是个温顺优雅,肤色如水银的大美女,小编暗恋她多时了,不知用什么优雅的方式表白,心涌澎湃却又猥琐至极,其实真正懵圈的是我这个可怜而又孤独的猿人;
在这里插入图片描述

给你看看上图所对应我的屎坨代码,太喽了,搓的一比!

   <el-table-column label="单价" prop="dePrice" width="180">
    <template slot-scope="scope">
      <el-form-item :prop="'oaBudgetDetailList.' + scope.$index + '.dePrice'" :rules="subRules.de_price" label-width="0">
       <el-input v-model="scope.row.dePrice" placeholder="请输入单价" @input="handleMouseLeave"/>
       </el-form-item>
      </template>
    </el-table-column>
   <el-table-column label="数量" prop="deNumber" width="180">
    <template slot-scope="scope">
      <el-form-item :prop="'oaBudgetDetailList.' + scope.$index + '.deNumber'" :rules="subRules.de_number" label-width="0">
       <el-input v-model="scope.row.deNumber" placeholder="请输入数量" @input="handleMouseLeave"/>
        </el-form-item>
      </template>
   </el-table-column>
   <el-table-column label="总价" width="180">
     <template slot-scope="scope">
       <div style="background-color: #cccccc;padding: 6px;">{{multiplyWithPrecision(Number(scope.row.dePrice), Number(scope.row.deNumber))}}</div>
      </template>
 </el-table-column>

鼠标移开后执行了方法:

    /**计算两个数相乘**/
    multiplyWithPrecision(num1, num2) {
      const total = num1 * num2;
      return Number(total);
    }

你铁定没看懂吧,这也许是我多年找不到女朋友的最直接的原因,代码写的喽,女孩、女人、妇女、大妈、奶奶根本不看你一眼,我TM太难了🤦‍♂️,在爱情的云端,希望高人指点,早日摆脱单身狗,小编确实太寂寞,美好的渴望总是经常回味会计从身边走过的那股浓郁芳香的风,我愿随风潜入夜,却总润物细无声。

如何解决精度丢失

terminal 进入到 ruoyi-ui 根目录执行下面命令行:

npm install --save decimal.js

在这里插入图片描述
node_modules 目录就多一个文件:

在这里插入图片描述
引入

import Decimal from "decimal.js";

将计算方法改造如下:

    /**计算两个数相乘**/
    multiplyWithPrecision(num1, num2) {
      return Decimal.mul(num1, num2).toNumber();
    }

这个代码,你应该可以看得懂吧,看不懂你是装不懂吧。优雅到总算能在产品经理面前甩甩发型了,从来很少和小编说话的会计既然笑着竖起大拇指!没想到技术总监既然把项目中的财务管理模块的开发分给了小编,这可把小编乐坏了,终于有机会和会计对接业务了,我美了美了美了、我醉了醉了醉了,我爱编程不爱加班的历史颠覆了;🌹🌹🌹🌹🌹🌹🌹🌹🌹

最终项目既然开源了,小编为您呈上,支持下多多 star!您的支持是我源泉的动力。

开源地址:https://gitee.com/xnqysabout/ry-vue-flowable-xg


总结

解决前端小数计算精度丢失的问题,非常简单,Decimal库能有效解决此问题,它内部以高精度方式存储和处理数字,摒弃二进制浮点数弊端。加、减、乘、除等运算能精准得到期望结果。

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

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

相关文章

小程序textarea组件键盘弹起会遮挡住输入框

<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡&#xff1a; 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…

k8s笔记29--使用kyverno提高运维效率

k8s笔记29--使用kyverno提高运维效率 介绍原理安装应用场景自动修正测试环境pod资源强制 Pod 标签限制容器镜像来源禁止特权容器其它潜在场景 注意事项说明 介绍 Kyverno是一个云原生的策略引擎&#xff0c;它最初是为k8s构建的&#xff0c;现在也可以在k8s集群之外用作统一的…

如何理解机器学习中的线性模型 ?

在机器学习中&#xff0c;线性模型是一类重要且基础的模型&#xff0c;它假设目标变量&#xff08;输出&#xff09;是输入变量&#xff08;特征&#xff09;的线性组合。线性模型的核心思想是通过优化模型的参数&#xff0c;使模型能够捕捉输入与输出之间的线性关系。以下是线…

数据结构初阶---排序

一、排序相关概念与运用 1.排序相关概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的…

树莓派-5-GPIO的应用实验之GPIO的编码方式和SDK介绍

文章目录 1 GPIO编码方式1.1 管脚信息1.2 使用场合1.3 I2C总线1.4 SPI总线2 RPI.GPIO2.1 PWM脉冲宽度调制2.2 静态函数2.2.1 函数setmode()2.2.2 函数setup()2.2.3 函数output()2.2.4 函数input()2.2.5 捕捉引脚的电平改变2.2.5.1 函数wait_for_edge()2.2.5.2 函数event_detect…

学习RocketMQ

1.为什么要用MQ&#xff1f; 消息队列是一种“先进先出”的数据结构 其应用场景主要包含以下4个方面&#xff1a; 1.1 异步解耦​ 最常见的一个场景是用户注册后&#xff0c;需要发送注册邮件和短信通知&#xff0c;以告知用户注册成功。传统的做法有以下两种&#xff1a; …

3DGabor滤波器实现人脸特征提取

import cv2 import numpy as np# 定义 Gabor 滤波器的参数 kSize 31 # 滤波器核的大小 g_sigma 3.0 # 高斯包络的标准差 g_theta np.pi / 4 # Gabor 函数的方向 g_lambda 10.0 # 正弦波的波长 g_gamma 0.5 # 空间纵横比 g_psi np.pi / 2 # 相位偏移# 生成 Gabor 滤…

LabVIEW自动扫描与图像清晰度检测

要在LabVIEW中实现通过电机驱动相机进行XY方向扫描&#xff0c;找到物品并获取最清晰的图像&#xff0c;可以采用以下方案&#xff1a; 1. 系统概述 硬件组成&#xff1a;电机驱动的XY扫描平台、工业相机、控制器&#xff08;如NI的运动控制卡&#xff09;、计算机。 软件平台…

Vue3(一)

1.Vue3概述 Vue3的API由Vue2的选项式API改为了组合式API。但是&#xff0c;也是Vue2中的选项式API也是兼容的。 2.创建Vue3项目 create-vue 是 Vue 官方新的脚手架工具&#xff0c;底层切换到了 vite。使用create-vue创建项目的步骤如下&#xff1a; 安装 create-vue npm i…

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称&#xff1a; Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色&#xff0c;例如说话人识别和验证。变换器模型…

STM32学习(十)

I2C模块内部结构 I2C&#xff08;Inter-Integrated Circuit&#xff09;模块是一种由Philips公司开发的二线式串行总线协议&#xff0c;用于短距离通信&#xff0c;允许多个设备共享相同的总线‌。 ‌硬件连接简单‌&#xff1a;I2C通信仅需要两条总线&#xff0c;即SCL&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上&#xff0c;有什么技术可以实现这个方法&#xff1f; 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具&#xff0c;给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

Mysql--运维篇--日志管理(连接层,SQL层,存储引擎层,文件存储层)

MySQL提供了多种日志类型&#xff0c;用于记录不同的活动和事件。这些日志对于数据库的管理、故障排除、性能优化和安全审计非常重要。 一、错误日志 (Error Log) 作用&#xff1a; 记录MySQL服务器启动、运行和停止期间遇到的问题和错误信息。 查看&#xff1a; 默认情况下…

现代谱估计的原理及MATLAB仿真(二)(AR模型法、MVDR法、MUSIC法)

现代谱估计的原理及MATLAB仿真AR参数模型法&#xff08;参数模型功率谱估计&#xff09;、MVDR法&#xff08;最小方差无失真响应法&#xff09;、MUSIC法&#xff08;多重信号分类法&#xff09; 文章目录 前言一、AR参数模型1 原理2 MATLAB仿真 二、MVDR法1 原理2 MATLAB仿真…

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

Linux (CentOS) 安装 Docker 和 Docker Compose

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

简单说一下 类

类的定义 类是用来对一个实体&#xff08;对象&#xff09;进行描述&#xff0c;类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci

1.关闭MySQL8的服务CTRLshiftESC&#xff0c;找到MySQL关闭服务即可 2.找到配置文件路径&#xff08;msi版本默认&#xff09; C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…

机器学习实战——K-近邻法(K-Nearest Neighbors,KNN)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 在机器学习的广阔领域中&#xff0c;K-近邻法&#xff08;KNN&#xff09; 是一种既简单又强大的非参数分类方法。尽管其…