前端计算精度丢失问题

// 精度丢失异常数据汇总
10.3950 * 3935.00 = 期望40904.33, 异常结果40904.32
7.3950 * 3835.00 = 期望28359.83, 异常结果28359.82
11.777 * 4215 = 期望49640.06, 异常结果49640.05
12.445 * 4005 = 期望49842.23,异常结果49842.22
3721*17.0480 = 期望63435.61,异常结果63435.60
3621*5.0060 = 期望18126.73,异常结果18126.72

vue项目中直接装插件

npm install bignumber.js
import { BigNumber } from 'bignumber.js';
// +
export function add(a, b) {a = BigNumber(a);b = BigNumber(b);return a.plus(b).toNumber();   //结果需要用toNumber转为普通数字
}
// -
export function minus(a, b) {a = BigNumber(a);b = BigNumber(b);return a.minus(b).toNumber();
}
// *
export function mut(a, b) {a = BigNumber(a);b = BigNumber(b);return a.multipliedBy(b).toNumber();
}
// /
export function dev(a, b) {a = BigNumber(a);b = BigNumber(b);return a.dividedBy(b).toNumber();
}

界面中使用:

import {add,minus,mut,dev
} from '@/utils/common.js' //公共方法row.amountStr = (this.mut(Number(row.salePriceStr), Number(row.weightStr))).toFixed(2)

toFixed也有精度丢失问题,直接main.js中改写toFixed方法

Number.prototype.toFixed = function(d) {var s = this + ''if (!d) d = 0if (s.indexOf('.') === -1) s += '.'s += new Array(d + 1).join('0')if (new RegExp('^(-|\\+)?(\\d+(\\.\\d{0,' + (d + 1) + '})?)\\d*$').test(s)) {let s = '0' + RegExp.$2; var pm = RegExp.$1; var a = RegExp.$3.length; var b = trueif (a === d + 2) {a = s.match(/\d/g)if (parseInt(a[a.length - 1]) > 4) {for (var i = a.length - 2; i >= 0; i--) {a[i] = parseInt(a[i]) + 1if (a[i] === 10) {a[i] = 0b = i !== 1} else break}}s = a.join('').replace(new RegExp('(\\d+)(\\d{' + d + '})\\d$'), '$1.$2')}if (b) s = s.substr(1)return (pm + s).replace(/\.$/, '')}return this + ''
}

如果vue3中遇到精度丢失问题,可以创建一个fixed.js文件

// // js
if (!Number.prototype._toFixed) {// eslint-disable-next-line no-extend-nativeNumber.prototype._toFixed = Number.prototype.toFixed
}
// eslint-disable-next-line no-extend-native
Number.prototype.toFixed = function (d) {let s = this + ''if (!d) {d = 0}if (s.indexOf('.') === -1) {s += '.'}s += new Array(d + 1).join('0')if (new RegExp('^(-|\\+)?(\\d+(\\.\\d{0,' + (d + 1) + '})?)\\d*$').test(s)) {let s = '0' + RegExp.$2let pm = RegExp.$1let a = RegExp.$3.lengthlet b = trueif (a === d + 2) {a = s.match(/\d/g)if (parseInt(a[a.length - 1]) > 4) {for (let i = a.length - 2; i >= 0; i--) {a[i] = parseInt(a[i]) + 1if (a[i] === 10) {a[i] = 0b = i !== 1} else {break}}}s = a.join('').replace(new RegExp('(\\d+)(\\d{' + d + '})\\d$'), '$1.$2')}if (b) {s = s.substr(1)}return (pm + s).replace(/\.$/, '')}return this + ''
}

然后再main.ts文件中引入即可

import '@/utils/fixed'

方式二: 封装js方法

// 乘法
function highPrecisionMul(data1, data2) {let m = 0;const s1 = data1.toString();const s2 = data2.toString();// 获取所有参数小数位长度之和try {m += s1.split(".")[1].length;} catch (e) { e => e }try {m += s2.split(".")[1].length;} catch (e) { e => e }// 替换掉小数点转为数字相乘再除以10的次幂值return ((Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /Math.pow(10, m));
};// 加法function highPrecisionAdd(data1, data2) {let r1, r2;// 获取每个参数的小数的位数try {r1 = data1.toString().split(".")[1].length;} catch (e) {r1 = 0;}try {r2 = data2.toString().split(".")[1].length;} catch (e) {r2 = 0;}// 计算底数为10以最大小数位数为次幂的值const m = Math.pow(10, Math.max(r1, r2));// 把所有参数转为整数后相加再除以次幂的值return (data1 * m + data2 * m) / m;
};// toFixed精度问题  重写function toSuperFixed(n, d) {var s = n + "";if (!d) d = 0;if (s.indexOf(".") === -1) s += ".";s += new Array(d + 1).join("0");if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (d + 1) + "})?)\\d*$").test(s)) {let s = "0" + RegExp.$2; var pm = RegExp.$1; var a = RegExp.$3.length; var b = true;if (a === d + 2) {a = s.match(/\d/g);if (parseInt(a[a.length - 1]) > 4) {for (var i = a.length - 2; i >= 0; i--) {a[i] = parseInt(a[i]) + 1;if (a[i] === 10) {a[i] = 0;b = i !== 1;} else break;}}s = a.join("").replace(new RegExp("(\\d+)(\\d{" + d + "})\\d$"), "$1.$2");}if (b) s = s.substr(1);return (pm + s).replace(/\.$/, "");}return this + "";
}

使用:

this.toSuperFixed(this.highPrecisionMul(Number(row.priceStr), Number(row.weightStr)), 2)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

使用 Windbg 分析软件异常时的诸多细节与技巧总结

目录 1、dump文件 1.1、dump文件的生成方式 1.2、dump文件的大小 2、pdb符号文件 2.1、pdb文件的路径设置 2.2、pdb文件的时间戳与名称问题 2.3、如何确定要找哪些pdb文件? 3、使用Windbg静态分析dump文件以及动态调试程序的一般步骤 4、确定发生异常或崩溃…

能力素质模型在企业中的应用

在我国经济飞速发展中,企业也获得了越来越多的业务。业务的增加带来的是人力管理上的不足,很多企业一味的着眼于业务的营收,而忽视了人力资源管理上的跟进,人力资源管理水平逐渐跟不上业务的迅猛发展,所以企业需要一套…

程序员的海外营收

在素材图片平台生成AI图片,通过下载赚取版税。 Wirestock这个平台能让你方便地把作品上传到多个素材市场,比如Adobe Stock、Shutterstock和iStock等。 你只需要上传一次,就能在多个平台上销售。 你可以开作坊、网上教程,或者在…

使用Netty实现Socket网络编程

** Netty初步讲解和认识 ** 网络通信模型 Netty支持多种网络通信模型,包括传统的阻塞I/O、非阻塞I/O、多路复用I/O和异步I/O。其中,非阻塞I/O和多路复用I/O是Netty的核心特性。 非阻塞I/O:Netty通过使用Java的NIO(New I/O&…

JavaScript删除数组中指定元素的五种方法有哪些

JavaScript中删除数组中指定元素的方法有多种,以下列出五种常见方法: 使用filter()方法:filter()方法创建一个新数组,新数组中的元素是通过检查指定条件后从原数组中筛选出来的。如果元素满足条件,它就会被包含在新数组…

buuctf[极客大挑战 2019]BabySQL--联合注入、双写过滤

目录 1、测试万能密码: 2、判断字段个数 3、尝试联合注入 4、尝试双写过滤 5、继续尝试列数 6、查询数据库和版本信息 7、查询表名 8、没有找到和ctf相关的内容,查找其他的数据库 9、查看ctf数据库中的表 10、查询Flag表中的字段名 11、查询表…

Python图像处理【17】指纹增强和细节提取

指纹增强和细节提取 0. 前言1. 形态学操作基础2. 利用形态学操作进行指纹增强3. 从增强指纹中提取特征(细节)3.1 指纹细节概念3.2 提取指纹细节 小结系列链接 0. 前言 指纹识别和验证是最古老,最流行和广泛使用的生物特征技术。众所周知,每个人都有独特…

模型\视图一般步骤:为什么经常要用“选择模型”QItemSelectionModel?

一、“使用视图”一般的步骤: //1.创建 模型(这里是数据模型!) tabModelnew QSqlTableModel(this,DB);//数据表 //2.设置 视图的模型(这里是数据模型!) ui->tableView->setModel(tabModel); 模型种类: QStringListModel…

SemiDrive E3 打包说明

一、 概述 本文介绍 E3 PAC 打包,编译器生成 bin 文件需要通过打包生成 PAC 包,再通过 SDToolBox 工具将 PAC 包烧写到芯片,PAC 包的物理载体分为 Flash、eMMC、SD,一个 PAC包最多支持 3 个BootPackage;本文主要描述打…

代码随想录算法训练营第一天| 27 移除元素 704 二分查找

目录 27 移除元素 704 二分查找 27 移除元素 快指针遍历&#xff0c;慢指针记录 class Solution { public:int removeElement(vector<int>& nums, int val) {int l 0,r 0;for(;r < nums.size();r){if(nums[r] val){}else{nums[l] nums[r];}}return l;} }; …

iOS 应用上架指南:资料填写及提交审核

摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南&#xff0c;包括创建应用、资料填写-综合、资料填写-IOS App和提交审核等步骤。通过本指南&#xff0c;您将了解到如何填写正确的资料&#xff0c;并顺利通过苹果公司的审核。 引言 在开发iOS应用后&#xff0c;将其…

医院里的管家婆,如何才能把科室的设备设施管理好?

在医院的各个科室中&#xff0c;有一位不可或缺的重要角色&#xff0c;科室的“管家婆”&#xff0c;大事、小事&#xff0c;事事都归她管&#xff0c;她就是护士长。她不仅是护理工作的核心&#xff0c;更是科室设备设施的“管家婆”。管理众多设备和资产&#xff0c;确保其正…

ArcMap实现多行标注

地图标注是地图的重要组成部分&#xff0c;也是地理信息的重要表达方式​。ArcMap的符号化系统为我们添加地图标注提供了方便&#xff0c;但是有时我们却需要添加多行标注&#xff0c;今天我们一起来探索一下ArcMap中两行标注的实现方式​。 首先&#xff0c;我们右击目标图层…

Oracle-探究统计信息收集自动采样AUTO_SAMPLE_SIZE

前言&#xff1a; Oracle数据库进行统计信息收集时&#xff0c;可以通过ESTIMATE_PERCENT参数指定采样方式或者比例&#xff0c;有以下4种指定的方式 1 统计信息收集时不指定值&#xff0c;这时候ESTIMATE_PERCENT值为默认值DBMS_STATS.AUTO_SAMPLE_SIZE&#xff0c;自动采样 …

TXB2 ELISA kit—Enzo Life Sciences ELISA试剂盒

高灵敏、经过充分验证的ELISA试剂盒&#xff0c;3小时内即可得结果 血栓素A2&#xff08;TXA2&#xff09;参与血小板聚集、血管收缩和生殖功能&#xff0c;但在生理条件下的半衰期仅有37秒。血栓素B2&#xff08;TXB2&#xff09;是TXA2非酶水合的稳定产物&#xff0c;因此体内…

Kafka之集群搭建

1. 为什么要使用kafka集群 单机服务下&#xff0c;Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是&#xff0c;在实际工作中使用时&#xff0c;单机搭建的Kafka会有很大的局限性。 ​ 消息太多&#xff0c;需要分开保存。Kafka是面向海量消息设计的&#xff0c;一个T…

Python专家编程系列: 8. 高级数据结构介绍

0. 标题 Python专家编程系列: 8. 高级数据结构介绍 id:4 作者: quantgalaxyoutlook.com blog: https://blog.csdn.net/quant_galaxy 欢迎交流1. 介绍 Python中&#xff0c;除了大家常用的数据结构外&#xff0c;还有几个非常好用的数据结构&#xff0c;这里主要介绍下H…

#Uniapp:uni-app中vue2生命周期--11个

uni-app中vue2生命周期 生命周期钩子描述H5App端小程序说明beforeCreate在实例初始化之后被调用 详情√√√created在实例创建完成后被立即调用 详情√√√beforeMount在挂载开始之前被调用 详情√√√mounted挂载到实例上去之后调用 详情 注意&#xff1a;此处并不能确定子组…

GoLang:sql.Exec()报错

【报错内容】 Sorry, can not exec into mysql: Error 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ... 【原因】 sql.Exec 在大多数情况下只能执行单条SQL语句…