【js】js高精度加减乘除函数

加法

/*** 高精度加法函数,处理字符串或数字输入,去除尾部多余的零* @param {string|number} a - 被加数* @param {string|number} b - 加数* @returns {string} - 计算结果,去除尾部多余的零*/
export const add = (a, b) => {// 将输入转换为字符串a = typeof a === 'number' ? a.toString() : a;b = typeof b === 'number' ? b.toString() : b;// 分割整数部分和小数部分let [intA = '0', decA = '0'] = a.split('.');let [intB = '0', decB = '0'] = b.split('.');// 去除小数部分可能为空的情况decA = decA || '0';decB = decB || '0';// 将小数部分补齐到相同长度const maxDecLen = Math.max(decA.length, decB.length);decA = decA.padEnd(maxDecLen, '0');decB = decB.padEnd(maxDecLen, '0');// 初始化进位let carry = 0;let resultDec = '';// 从小数部分开始逐位相加for (let i = maxDecLen - 1; i >= 0; i--) {let sum = parseInt(decA[i]) + parseInt(decB[i]) + carry;carry = Math.floor(sum / 10);resultDec = (sum % 10) + resultDec;}// 处理整数部分let resultInt = '';intA = intA.padStart(Math.max(intA.length, intB.length), '0');intB = intB.padStart(Math.max(intA.length, intB.length), '0');// 从整数部分开始逐位相加for (let i = intA.length - 1; i >= 0; i--) {let sum = parseInt(intA[i]) + parseInt(intB[i]) + carry;carry = Math.floor(sum / 10);resultInt = (sum % 10) + resultInt;}// 如果还有进位,添加到结果的开头if (carry) resultInt = carry + resultInt;// 去除结果整数部分的前导零resultInt = resultInt.replace(/^0+/, '');if (resultInt === '') resultInt = '0';// 拼接结果,处理小数部分尾部多余的零let result = resultInt + (resultDec !== '0' ? '.' + resultDec.replace(/0+$/, '') : '');return result;
};

减法

/*** 高精度减法函数,处理字符串或数字输入,去除尾部多余的零* @param {string|number} a - 被减数* @param {string|number} b - 减数* @returns {string} - 计算结果,去除尾部多余的零*/
export const subtract = (a, b) => {// 将输入转换为字符串a = typeof a === 'number' ? a.toString() : a;b = typeof b === 'number' ? b.toString() : b;// 分割整数部分和小数部分let [intA = '0', decA = '0'] = a.split('.');let [intB = '0', decB = '0'] = b.split('.');// 去除小数部分可能为空的情况decA = decA || '0';decB = decB || '0';// 将小数部分补齐到相同长度const maxDecLen = Math.max(decA.length, decB.length);decA = decA.padEnd(maxDecLen, '0');decB = decB.padEnd(maxDecLen, '0');// 初始化借位let borrow = 0;let resultDec = '';// 从小数部分开始逐位相减for (let i = maxDecLen - 1; i >= 0; i--) {let diff = parseInt(decA[i]) - parseInt(decB[i]) - borrow;if (diff < 0) {diff += 10;borrow = 1;} else {borrow = 0;}resultDec = diff + resultDec;}// 处理整数部分let resultInt = '';intA = intA.padStart(Math.max(intA.length, intB.length), '0');intB = intB.padStart(Math.max(intA.length, intB.length), '0');// 从整数部分开始逐位相减for (let i = intA.length - 1; i >= 0; i--) {let diff = parseInt(intA[i]) - parseInt(intB[i]) - borrow;if (diff < 0) {diff += 10;borrow = 1;} else {borrow = 0;}resultInt = diff + resultInt;}// 去除结果整数部分的前导零resultInt = resultInt.replace(/^0+/, '');if (resultInt === '') resultInt = '0';// 拼接结果,处理小数部分尾部多余的零let result = resultInt + (resultDec !== '0' ? '.' + resultDec.replace(/0+$/, '') : '');return result;
};

乘法

/*** 高精度乘法函数,处理字符串或数字输入,去除尾部多余的零* @param {string|number} a - 乘数* @param {string|number} b - 被乘数* @returns {string} - 计算结果,去除尾部多余的零*/
const multiply = (a, b) => {a = typeof a === 'number' ? a.toString() : a;b = typeof b === 'number' ? b.toString() : b;let [intA, decA] = a.split('.');let [intB, decB] = b.split('.');decA = decA || '0';decB = decB || '0';const totalDecLen = decA.length + decB.length;const intPartA = intA + decA;const intPartB = intB + decB;let result = Array(intPartA.length + intPartB.length).fill(0);for (let i = intPartA.length - 1; i >= 0; i--) {for (let j = intPartB.length - 1; j >= 0; j--) {let product = parseInt(intPartA[i]) * parseInt(intPartB[j]) + result[i + j + 1];result[i + j + 1] = product % 10;result[i + j] += Math.floor(product / 10);}}result = result.join('').replace(/^0+/, '');if (totalDecLen > 0) {const integerLen = result.length - totalDecLen;if (integerLen <= 0) {result = '0.' + '0'.repeat(-integerLen) + result;} else {result = result.slice(0, integerLen) + '.' + result.slice(integerLen);}result = result.replace(/(\.[0-9]*?)0+$/, '$1').replace(/\.$/, '');} else {result = result || '0';}return result;
};

除法

/*** 高精度除法函数,处理字符串或数字输入,去除尾部多余的零* @param {string|number} dividend - 被除数* @param {string|number} divisor - 除数* @param {number} precision - 结果保留的小数位数,默认为 28* @returns {string} - 计算结果,去除尾部多余的零*/
export const highPrecisionDivision = (dividend, divisor, precision = 28) => {const dividendStr = String(dividend);const divisorStr = String(divisor);let [dividendInt = '0', dividendDec = ''] = dividendStr.split('.');let [divisorInt = '0', divisorDec = ''] = divisorStr.split('.');const maxDecLength = Math.max(dividendDec.length, divisorDec.length, precision);dividendDec = dividendDec.padEnd(maxDecLength, '0');divisorDec = divisorDec.padEnd(maxDecLength, '0');const dividendFull = dividendInt + '.' + dividendDec;const divisorFull = divisorInt + '.' + divisorDec;const bigDividend = parseFloat(dividendFull);const bigDivisor = parseFloat(divisorFull);let result = (bigDividend / bigDivisor).toFixed(precision);// 去除尾部多余的零result = result.replace(/\.?0+$/, '');return result;
};
add(0.1, "0.3") // 0.4
add(0.1, 0.3) // 0.4
add(0.1687486415614614, 0.3) // 0.4687486415614614
add("5614", "999999999999999991454444444444444444444444444444") // 999999999999999991454444444444444444444444450058subtract("5", "3") // 2
subtract(123.45, "67.89") // 55.56
subtract('561456.514614', "679") // 560777.514614
subtract("1000000000000000000000000000000", "1") // 999999999999999999999999999999multiply("123", "456") // 56088
multiply(0.52, "67.89") // 35.3028
multiply(0.548568482, "0.5688974989") // 0.3120792373851696698
multiply("1000000000000000000000000000000", "1") // 1000000000000000000000000000000highPrecisionDivision(10,2) // 5
highPrecisionDivision(0.456,0.00458) // 0.1249999988609375028980608135
highPrecisionDivision('0.456',0.08) // 0.1249999988609375028980608135
highPrecisionDivision(42424,424732545354332543543) // 0.0000000000000000998840339975

在这里插入图片描述
感谢你的阅读,如对你有帮助请收藏+关注!
只分享干货实战精品从不啰嗦!!!
如某处不对请留言评论,欢迎指正~
博主可收徒、常玩QQ飞车,可一起来玩玩鸭~

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

LLM应用:行业大模型

大语言模型正在朝着两个方向发展&#xff0c;一个是以ChatGPT为代表的通用大模型&#xff0c;另一个则是行业大模型&#xff08;或称为“专业大模型”&#xff09;。如果大模型的演化分为阴阳两面&#xff0c;通用大模型更像是阳面&#xff0c;受众更广、更to C端&#xff0c;以…

【PVE】新增2.5G网卡作为主网卡暨iperf测速流程

【PVE】新增2.5G网卡作为主网卡暨iperf测速流程 新增网卡 新增网卡的首先当然需要关闭PVE母机&#xff0c;把新网卡插上&#xff0c;我用淘宝遥现金搞了个红包&#xff0c;花了26元买了块SSU的2.5G网卡。说实话这个价位连散热片都没有&#xff0c;确实挺丐的。稍后测下速度看…

深入了解代理IP常见协议:区别与选择

代理服务器在网络使用中扮演着重要的角色&#xff0c;是您设备和互联网之间的中间层。它不仅可以增强网络访问的安全性和隐私保护&#xff0c;还可以提供许多灵活的应用。使用代理时&#xff0c;不同的协议类型对数据交换具有不同的规则和特征。常见的代理协议包括HTTP代理、HT…

WTM的项目中EFCore如何适配人大金仓数据库

一、WTM是什么 WalkingTec.Mvvm框架&#xff08;简称WTM&#xff09;最早开发与2013年&#xff0c;基于Asp.net MVC3 和 最早的Entity Framework, 当初主要是为了解决公司内部开发效率低&#xff0c;代码风格不统一的问题。2017年9月&#xff0c;将代码移植到了.Net Core上&…

鸿蒙架构之AOP

零、主要内容 AOP 简介ArkTs AOP 实现原理 JS 原型链AOP实现原理 AOP的应用场景 统计类&#xff1a; 方法调用次数统计、方法时长统计防御式编程&#xff1a;参数校验代理模式实现 AOP的注意事项 一、AOP简介 对于Android、Java Web 开发者来说&#xff0c; AOP编程思想并不…

TotalSegmentator---针对CT/MRI数据的自动分割

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享开源软件TotalSegmentator&#xff0c;该开源项目针对CT/MRI数据类型&#xff0c;对主要的解剖学结构进行自动分割&#xff0c;并且被集成到MITK中。希望对各…

如何分辨AI生成的内容?AI生成内容检测工具对比实验

检测人工智能生成的文本对各个领域的组织都提出了挑战&#xff0c;包括学术界和新闻界等。生成式AI与大语言模型根据短描述来进行内容生成的能力&#xff0c;产生了一个问题&#xff1a;这篇文章/内容/作业/图像到底是由人类创作的&#xff0c;还是AI创作的&#xff1f;虽然 LL…

TCP 握手数据流

这张图详细描述了 TCP 握手过程中&#xff0c;从客户端发送 SYN 包到服务器最终建立连接的整个数据流转过程&#xff0c;包括网卡、内核、进程中的各个环节。下面对每个步骤进行详细解释&#xff1a; 客户端到服务器的初始连接请求 客户端发送 SYN 包&#xff1a; 客户端发起…

【音频特征提取】傅里叶变换算法源码学习记录

目录 背景快速理解FFT&#xff08;快速傅里叶变换&#xff09;IFFT&#xff08;逆傅里叶变换&#xff09;STFT&#xff08;短时傅里叶变换&#xff09; 代码实现FFT源代码IFFT源代码FFT、IFFT自己实验STFT源代码STFT自己实验 总结 背景 最近用到了相关操作提取音频信号特征&am…

Apache配置与应用(企业网站架构部署与优化)

本章结构 如果要修改以上文件中的内容&#xff0c;想要生效&#xff0c;需要在主配置文件中能够扫描到这个默认文件的修改&#xff1a; 文件在&#xff1a; Apache 连接保持 Apache 的访问控制 针对IP地址的限制缺陷是不可预知性&#xff0c;需要事先直到对方的IP才能进行基于…

剪画小程序:雷军演讲真精彩:视频/录音转文本

最近&#xff0c;雷军在小米汽车发布会的演讲精彩绝伦&#xff0c;其中的经典语句深深触动了我。为了能够随时随地回味这些充满智慧和激情的话语&#xff0c;我使用了剪画这一神奇的工具&#xff0c;将演讲视频转换成音频&#xff0c;并保存到了自己的手机里。 在这个信息爆炸的…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者&#xff0c;Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

【扩散对抗】AdvDiffuser: Natural Adversarial Example Synthesis with Diffusion Models

原文标题&#xff1a; AdvDiffuser: Natural Adversarial Example Synthesis with Diffusion Models 原文代码&#xff1a; https://github.com/lafeat/advdiffuser 发布年度&#xff1a; 2023 发布期刊&#xff1a; ICCV 目录 摘要背景创新点模型Adversarial GuidanceAdversar…

FlutterFlame游戏实践#15 | 生命游戏 - 演绎启动

theme: cyanosis 本文为稀土掘金技术社区首发签约文章&#xff0c;30天内禁止转载&#xff0c;30天后未获授权禁止转载&#xff0c;侵权必究&#xff01; Flutter\&Flame 游戏开发系列前言: 该系列是 [张风捷特烈] 的 Flame 游戏开发教程。Flutter 作为 全平台 的 原生级 渲…

零基础做项目---五子棋对战---day02

用户模块 完成注册登录&#xff0c;以及用户分数管理~使用数据库来保存上述用户信息. 使用 MyBatis来连接并操作数据库了 主要步骤: 1.修改 Spring的配置文件,使数据库可以被连接上. 2.创建实体类&#xff0c;用户, User 3.创建Mapper接口~ 4.实现MyBatis 的相关xml配置…

【ffmpeg系列二点五】(失败,建议放弃)ubuntu下进行源码构建,给ffmpeg7.0.1添加hevc支持。

背景 windows下构建失败&#xff0c;ffmpeg对于flv-h265的处理得到新的报错。 开始ubuntu22下编译 pre&#xff1a;清除我们之前编译的nightly版本 sudo rm -rf /usr/local/bin/ffmpeg sudo rm -rf /usr/local/bin/ffprobe sudo rm -rf /usr/local/bin/ffserver sudo rm -…

轻松掌握图片压缩技巧,释放存储空间!

前言 在这个充满视觉冲击的时代&#xff0c;我们每天都在创造和分享图片。但你是否发现&#xff0c;手机和电脑的存储空间越来越不够用了&#xff1f;图片文件过大&#xff0c;不仅占用空间&#xff0c;还影响传输速度和网页加载。今天&#xff0c;就让我来教你几招&#xff0…

Python爬虫:BeautifulSoup的基本使用方法!

1.简介 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析“标签树”等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup…

Python基础语法:变量和数据类型详解(整数、浮点数、字符串、布尔值)①

文章目录 变量和数据类型详解&#xff08;整数、浮点数、字符串、布尔值&#xff09;一、变量二、数据类型1. 整数&#xff08;int&#xff09;2. 浮点数&#xff08;float&#xff09;3. 字符串&#xff08;str&#xff09;4. 布尔值&#xff08;bool&#xff09; 三、类型转换…

生物打印后的生物力学过程

生物打印后的生物力学过程 3D生物打印技术在组织工程领域展现出巨大的潜力&#xff0c;但打印后组织的生物力学特性对其最终成功至关重要。本文将详细介绍打印后组织的生物力学特性及其在组织工程中的应用。 1. 打印后水凝胶交联 原位交联可以在生物打印过程中提供足够的机械…