前端数字计算精度问题

计算精度问题通常发生在浮点数运算中,由于浮点数的表示所限,可能导致精度损失。

举例
// 比如
0.1 + 0.2 // 结果为 0.30000000000000004
0.3 - 0.1 // 结果为 0.19999999999999996

vue

vue 使用decimal.js 解决小数相加合计精确度丢失问题

微信小程序

  1. 在utils下创建一个名为commonFunc.js的文件
'use strict';Object.defineProperty(exports, '__esModule', {value: true
});/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
user ,medthor
NP.strip(num) // strip a number to nearest right number
NP.plus(num1, num2, num3, ...) // addition, num + num2 + num3, two numbers is required at least.
NP.minus(num1, num2, num3, ...) // subtraction, num1 - num2 - num3
NP.times(num1, num2, num3, ...) // multiplication, num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // division, num1 / num2 / num3
NP.round(num, ratio) // round a number based on ratio
***************************************************************************** /
/ global Reflect, Promise */function __spreadArrays() {for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;for (var r = Array(s), k = 0, i = 0; i < il; i++)for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)r[k] = a[j];return r;
}
/**
@desc 解决浮动运算问题,避免小数点后产生多位数和计算精度损失。
问题示例:2.3 + 2.4 = 4.699999999999999,1.0 - 0.9 = 0.09999999999999998
**/
/** 
把错误的数据转正
strip(0.09999999999999998)=0.1
*/
function strip(num, precision) {if (precision === void 0) {precision = 15;}return +parseFloat(Number(num).toPrecision(precision));
}
/** 
Return digits length of a number
@param {number} num Input number
*/
function digitLength(num) {// Get digit length of evar eSplit = num.toString().split(/[eE]/);var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);return len > 0 ? len : 0;
}
/** 
把小数转成整数,支持科学计数法。如果是小数则放大成整数
@param {number} num 输入数
*/
function float2Fixed(num) {if (num.toString().indexOf('e') === -1) {return Number(num.toString().replace('.', ''));}var dLen = digitLength(num);return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
}
/** 
检测数字是否越界,如果越界给出提示
@param {number} num 输入数
*/
function checkBoundary(num) {if (_boundaryCheckingState) {if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {console.warn(num + " is beyond boundary when transfer to integer, the results may not be accurate");}}
}
/** 
精确乘法
*/
function times(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return times.apply(void 0, __spreadArrays([times(num1, num2), others[0]], others.slice(1)));}var num1Changed = float2Fixed(num1);var num2Changed = float2Fixed(num2);var baseNum = digitLength(num1) + digitLength(num2);var leftValue = num1Changed * num2Changed;checkBoundary(leftValue);return leftValue / Math.pow(10, baseNum);
}
/** 
精确加法
*/
function plus(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return plus.apply(void 0, __spreadArrays([plus(num1, num2), others[0]], others.slice(1)));}var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
}
/** 
精确减法
*/
function minus(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return minus.apply(void 0, __spreadArrays([minus(num1, num2), others[0]], others.slice(1)));}var baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
}
/** 
精确除法
*/
function divide(num1, num2) {var others = [];for (var _i = 2; _i < arguments.length; _i++) {others[_i - 2] = arguments[_i];}if (others.length > 0) {return divide.apply(void 0, __spreadArrays([divide(num1, num2), others[0]], others.slice(1)));}var num1Changed = float2Fixed(num1);var num2Changed = float2Fixed(num2);checkBoundary(num1Changed);checkBoundary(num2Changed);// fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
}
/** 
四舍五入
*/
function round(num, ratio) {var base = Math.pow(10, ratio);return divide(Math.round(times(num, base)), base);
}
var _boundaryCheckingState = true;
/*
是否进行边界检查,默认开启
@param flag 标记开关,true 为开启,false 为关闭,默认为 true
*/
function enableBoundaryChecking(flag) {if (flag === void 0) {flag = true;}_boundaryCheckingState = flag;
}
var index = {strip: strip,plus: plus,minus: minus,times: times,divide: divide,round: round,digitLength: digitLength,float2Fixed: float2Fixed,enableBoundaryChecking: enableBoundaryChecking,
};
exports.strip = strip;
exports.plus = plus;
exports.minus = minus;
exports.times = times;
exports.divide = divide;
exports.round = round;
exports.digitLength = digitLength;
exports.float2Fixed = float2Fixed;
exports.enableBoundaryChecking = enableBoundaryChecking;
exports['default'] = index;
  1. 在页面引用
var commonFunc= require('../../utils/commonFunc');
Page({onload() {commonFunc.minus(0.2, 0.1)}
})

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

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

相关文章

【2024系统架构设计】回顾历史,查缺补漏篇 ①

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起

ARM功耗管理背景及挑战

安全之安全(security)博客目录导读

服务器网站漏洞怎么修复

服务器网站漏洞的修复是一个关键且复杂的过程&#xff0c;涉及到多个层面的安全加固。以下是一个关于如何修复服务器网站漏洞的详细指南。安全狗专业做服务器安全&#xff0c;有任何服务器安全问题都可以找安全狗哦. ​一、识别和分析漏洞 首先&#xff0c;要确定服务器网站存在…

基于NodeJS + Swagger UI搭建Web API界面

基于NodeJS Swagger UI搭建Web API界面 前言一、创建基于NodeJS的Swagger运行目录二、添加Swagger官方的示例1.创建public工作目录2.添加Swagger官方示例3.启动SwaggerUI实例 三、基于OpenAPI规范提供api文档 前言 Swagger是一个REST APIs文档在线自动生成和测试的框架 一、…

Linux下的基本指令(1)

嗨喽大家好呀&#xff01;今天阿鑫给大家带来Linux下的基本指令&#xff08;1&#xff09;&#xff0c;下面让我们一起进入Linux的学习吧&#xff01; Linux下的基本指令 ls 指令pwd命令cd 指令touch指令mkdir指令(重要)rmdir指令 && rm 指令(重要)man指令(重要)cp指…

基于 NXP iMX8MM 测试 Secure Boot 功能

By Toradex秦海 1). 简介 嵌入式设备对于网络安全的要求越来越高&#xff0c;而 Secure boot就是其中重要的一部分。 NXP i.MX8MM/i.MX8MP 处理器基于 HABv4 特性来提供 Secure boot 启动过程中的 Chain of Trust&#xff1b; HABv4 是基于公共密钥加密 (Public Key Cryptogr…

C语言进阶:指针的进阶(上)

首先 在学习新知识之前 我们先来回顾下之前的学习的内容 1 指针是个变量 用来存放地址 地址唯一标识的一块内存空间 2 指针的大小是固定的4/8字节&#xff08;32位平台/64位平台&#xff09; 3 指针有类型的 指针的类型决定了两点 一个是指针操作的权限以及整数的步长 4 指针的…

神经网络项目:全连接网络和卷积网络实现水果三分类项目

水果三分类项目 Git源码&#xff1a;传送门 水果种类&#xff1a;草莓、树莓、桑葚 0&#xff1a;草莓 strawberry1&#xff1a;树莓 raspberry2&#xff1a;桑葚 mulberry 项目设计 获取数据 spider.py数据清洗 cleaner.py自定义数据集 dataset.py网络构建 net.py训练模型 t…

2024年新版宝塔面板如何安装WordPress网站教程

使用宝塔面板安装WordPress教程 一、准备工作 安装了宝塔面板后&#xff0c;我们就可以开始搭建自己的网站了。以安装WordPress为例&#xff0c;本文将详细介绍两种安装方式&#xff1a;手动安装和宝塔后台一键部署。请注意&#xff0c;尽管一键部署方便快捷&#xff0c;但可…

git工具简单使用

文章目录 git上传克隆README.gitignore常用指令冲突 git 进行版本控制的版本控制器。安装git yum install -y git 配置git git config --global user.email "youexample.com" 告诉git你的邮箱是什么&#xff1f;最好输入你的gitee的注册邮箱git config --global …

人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用,DETR的原理与结构

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用&#xff0c;DETR的原理与结构。DETR&#xff08;Detected Transformers&#xff09;是一种基于Transformer的端到端目标检测模型&…

利用tree-sitter提取代码文件中的函数和注释

利用tree-sitter提取代码文件中的函数和注释 1. 需求2. 工具3. 实现 1. 需求 提取.c或.cpp文件中的带有注释的函数&#xff0c;作为训练数据喂给大语言模型。要求是能够批量处理&#xff0c;提取函数前带有注释的函数和注释&#xff0c;并将函数中的注释同样提取出来作为辅助训…

把 KubeBlocks 跑在 Kata 上,真的可行吗?

背景 容器的安全性一直是广受关注的话题。这个领域也产生了很多不错的开源项目。Kata就是其中之一。 Kata Containers&#xff08;简称 Kata&#xff09;是一种开源项目&#xff0c;它提供了一种安全而高性能的容器运行时环境。Kata Containers 利用虚拟化技术&#xff08;通常…

【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )

文章目录 4.最大子数组和4.1题目4.2解法一&#xff1a;暴力4.2.1暴力思路4.2.2代码实现 4.3解法二&#xff1a;贪心4.3.1贪心思路4.3.2代码实现 5.买卖股票的最佳时机||5.1题目5.2解法&#xff1a;贪心5.2.1贪心思路5.2.2代码实现 4.最大子数组和 4.1题目 给你一个整数数组 n…

【面经八股】搜广推方向:面试记录(十三)

【面经&八股】搜广推方向:面试记录(十三) 文章目录 【面经&八股】搜广推方向:面试记录(十三)1. 自我介绍2. 实习经历问答3. 八股之类的问题4. 编程题5. 反问6. 可以1. 自我介绍 。。。。。。 2. 实习经历问答 挑最熟的一个跟他讲就好了。 一定要熟~3. 八股之类…

Mac下XDebug安装

文章目录 1、下载对应的版本2、编译XDebug3、配置XDebug4、配置PhpStormDebug一下 前置工作 Mac下安装HomebrewMac下brew安装php7.4 1、下载对应的版本 首先按照支持的版本和兼容性来下载对应的版本&#xff0c;此表列出了仍支持哪些 Xdebug 版本&#xff0c;以及哪些版本可用…

GPT的全面历史和演变:从GPT-1到GPT-4

人工智能新篇章&#xff1a;GPT-4与人类互动的未来&#xff01; 本文探讨了生成式预训练 Transformer (GPT) 的显着演变&#xff0c;提供了从开创性的 GPT-1 到复杂的 GPT-4 的旅程。 每次迭代都标志着重大的技术飞跃&#xff0c;深刻影响人工智能领域以及我们与技术的互动。 我…

linux+ndk把jni制作成so库供apk使用(基础)

环境配置之类的我之前的博客有写,这篇文章我们就直接开始 1.在有ndk配置的服务器创建文件夹,文件夹再创建jni文件夹,jni文件夹里面放置Application.mk,Android.mk与test.c,因为我的ndk运行配置默认是项目下面的jni目录,所以我需要多一个jni目录 2.这里的Application.mk写的是架…

OpenHarmony语言基础类库【@ohos.util (util工具函数)】

ohos.util (util工具函数) 该模块主要提供常用的工具函数&#xff0c;实现字符串编解码&#xff08;[TextEncoder])&#xff0c;[TextDecoder]&#xff09;、有理数运算&#xff08;[RationalNumber8]&#xff09;、缓冲区管理&#xff08;[LRUCache9]&#xff09;、范围判断&…

5款好用的监控员工电脑软件推荐 (如何监控员工上班工作情况)

在现代的商业环境中&#xff0c;管理和监控员工的工作内容是至关重要的。 为了确保员工的工作效率和质量&#xff0c;公司需要使用一些工具来监控他们的工作进程。 以下是五款实用的监控员工工作内容的软件。 域智盾软件 域智盾是一款专为企业打造的智能管理系统。 它借助人…