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

embedded/2025/1/13 1:51:48/

文章目录

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


前言

在《工程投标项目管理系统》项目开发中工程项目预算、成本管理、财务管理等模块的开发中不可避免的要和金融数字打交道,数字的计算 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库能有效解决此问题,它内部以高精度方式存储和处理数字,摒弃二进制浮点数弊端。加、减、乘、除等运算能精准得到期望结果。


http://www.ppmy.cn/embedded/153428.html

相关文章

C++中的语句

文章目录 简单语句符合语句&#xff08;块&#xff09;switch语句break内部变量定义 while语句for语句do while语句goto语句try块和异常处理使用预处理器进行调试 简单语句 C中&#xff0c;大多数语句以分号结束。程序语句最简单的形式是空语句&#xff08;只有一个单独的分号…

Python Matplotlib 教程-Matplotlib 如何绘制常见图表

Python Matplotlib 如何绘制常见图表 Matplotlib 是 Python 中最流行的数据可视化库之一&#xff0c;提供了多种方式绘制各种图表&#xff0c;如折线图、柱状图、散点图、饼图等。本篇文章将从基础入门开始&#xff0c;逐步介绍如何使用 Matplotlib 绘制这些常见图表&#xff…

激活函数的实践选择

https://zhuanlan.zhihu.com/p/460177194https://zhuanlan.zhihu.com/p/460177194

Java设计模式 —— 【行为型模式】责任链模式(Chain-of-responsibility Pattern) 详解

文章目录 模式介绍优缺点适用场景模式结构案例实现 模式介绍 责任链模式又名职责链模式&#xff0c;它是一种对象行为的设计模式&#xff0c;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链&…

【Rust自学】11.8. 忽略测试

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.8.1. 忽略某些测试&#xff0c;执行剩余测试 某些测试执行起来非常耗时&#xff0c;所以…

verilogHDL仿真详解

前言 Verilog HDL中提供了丰富的系统任务和系统函数&#xff0c;用于对仿真环境、文件操作、时间控制等进行操作。&#xff08;后续会进行补充&#xff09; 正文 一、verilogHDL仿真详解 timescale 1ns/1ps //时间单位为1ns&#xff0c;精度为1ps&#xff0c; //编译…

【Unity3D】导出Android项目以及Java混淆

Android Studio 下载文件归档 | Android Developers Android--混淆配置&#xff08;比较详细的混淆规则&#xff09;_android 混淆规则-CSDN博客 Unity版本&#xff1a;2019.4.0f1 Gradle版本&#xff1a;5.6.4&#xff08;或5.1.1&#xff09; Gradle Plugin版本&#xff…

vscode-github个人使用记录

前言&#xff1a; 记录用vscode和github的过程&#xff0c;只有用过才会印象深刻&#xff0c;因此只记录使用过命令或者配置。 一、配置vscode和git 首先是配置vscode&#xff0c;每什么好说的&#xff0c;vscode原声支持github&#xff0c;直接ChtlShiftG&#xff0c;或者是…