首页 > 其他分享 >分别封装精确运算的加减乘除四个方法

分别封装精确运算的加减乘除四个方法

时间:2025-01-16 09:26:34浏览次数:1  
标签:封装 num1 num2 r1 toString split const 加减乘除 运算

在前端开发中,进行精确的加减乘除运算通常是因为JavaScript的浮点数运算存在精度问题。为了解决这个问题,可以使用一些库,如decimal.jsbig.js,或者手动实现这些方法。

以下是一个简单的示例,使用JavaScript手动封装精确的加减乘除四个方法:

/**
 * 精确加法
 * @param {number} num1 第一个数
 * @param {number} num2 第二个数
 * @return {string} 返回精确计算后的结果(字符串格式)
 */
function preciseAdd(num1, num2) {
    const r1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
    const r2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
    const m = Math.pow(10, Math.max(r1, r2));
    return ((num1 * m + num2 * m) / m).toFixed(Math.max(r1, r2));
}

/**
 * 精确减法
 * @param {number} num1 第一个数
 * @param {number} num2 第二个数
 * @return {string} 返回精确计算后的结果(字符串格式)
 */
function preciseSubtract(num1, num2) {
    const r1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
    const r2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
    const m = Math.pow(10, Math.max(r1, r2));
    // 保证 num2 不会比 num1 大,从而避免得到负数结果时出现问题
    const n = (r1 >= r2) ? r1 : r2;
    return ((num1 * m - num2 * m) / m).toFixed(n);
}

/**
 * 精确乘法
 * @param {number} num1 第一个数
 * @param {number} num2 第二个数
 * @return {string} 返回精确计算后的结果(字符串格式)
 */
function preciseMultiply(num1, num2) {
    const m = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
    const n = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
    return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, m + n)).toFixed(m + n);
}

/**
 * 精确除法
 * @param {number} num1 第一个数
 * @param {number} num2 第二个数
 * @return {string} 返回精确计算后的结果(字符串格式)
 */
function preciseDivide(num1, num2) {
    const t1 = num1.toString().split(".")[1] ? num1.toString().split(".")[1].length : 0;
    const t2 = num2.toString().split(".")[1] ? num2.toString().split(".")[1].length : 0;
    const r1 = Number(num1.toString().replace(".", ""));
    const r2 = Number(num2.toString().replace(".", ""));
    return (r1 / r2 * Math.pow(10, t2 - t1)).toFixed(Math.max(0, t1 - t2));
}

注意:这些方法返回的是字符串格式的结果,以确保精度。如果你需要数字格式的结果,可以使用parseFloat()Number()进行转换,但请注意这可能会引入一些微小的精度损失。

另外,这些方法没有处理可能的异常情况,如除数为0等。在实际应用中,你可能需要添加更多的错误处理和边界检查。

标签:封装,num1,num2,r1,toString,split,const,加减乘除,运算
From: https://www.cnblogs.com/ai888/p/18674174

相关文章

  • 封装
    封装1.封装思想封装概述是面向对象三大特征之一(封装,继承,多态)对象代表什么,就得封装对应的数据,并提供数据对应的行为封装代码实现将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx(......
  • 运算放大器应用电路设计笔记(一)
    1.1何谓运算放大器1.1.1运算放大器的诞生运算放大器简称OP,于20世纪40年代作为模拟计算机功能元件开发出来。要进行加减乘除的原始运算甚至微积分运算,只需在放大器中施加特殊的负反馈就可进行运算。1.1.2作为理想元件处理电路符号用三角形表示,左端为两个输入端,右端为输出端......
  • Day 5 运算符
    算术运算符:+,-,*,/,%,++,--           %取余模运算           ++--自增,自减一元运算符           例:赋值运算符:=关系运算符:>,<,>=,<=,==,!=,instanceof          ......
  • element中的条件字段页面封装
    笔记:页面搜索栏封装: <tableQueryFormref="queryFormRef":form-select="QUERY_FORM_SELECT":model="queryForm"><el-form-item:label="$swpT('page.swModulePlan.isSelf')"prop="orderCode&......
  • 封装按钮信息与按钮数量动态显示与提示信息并进行触发按钮组件
    标题:封装弹框并点击动态按钮组件进行触发功能:封装按钮信息与按钮数量动态显示组件页面:按钮信息与按钮数量动态显示,提示信息不固定封装组件页面: <template><el-dialogv-model="dialogVisible"class="stepCustom-dialogcustom-dialog-center"destroy-on-closeheight=......
  • 图表封装组件
    图表封装: 图表封装使用:<template><!--软件模块复用率图表--><chart-and-tableref="chartAndTableRef":chart-desc="chartDesc":chart-loading="chartLoading":columns="columns":list="list":......
  • 封装,继承,多态
    在Java中,封装、继承和多态是面向对象编程(OOP)的三大核心特性。它们共同构成了面向对象编程的基础,帮助开发者编写出模块化、可重用和可扩展的代码。以下是它们的详细讲解:1. 封装(Encapsulation)定义封装是指将对象的属性和行为(方法)包装在一起,并对外隐藏内部实现细节,只暴露必......
  • 随机生成20以内加减法运算题目
    <?phpfunctiongenerateMathProblem(){//随机选择加法或减法$operation=rand(0,1)?'+':'-';//生成两个0到20之间的随机数$num1=rand(0,20);$num2=rand(0,20);//计算结果,注意处理减法可能导致负数的情况if($operation=......
  • JS可选链运、逻辑或、空置合并运算符
    这段代码中包含了以下几个现代JavaScript的语法特性:可选链运算符(?.)逻辑或运算符(||)空值合并运算符(??)让我们逐一分析这些语法,以及它们在代码中的作用。1.可选链运算符(?.)语法含义:可选链运算符?.用于安全访问对象属性或调用方法。如果链式访问中的某个部分......
  • Django Admin 自定义操作封装
    1.为什么需要封装?在Django开发中,我们经常需要在Admin界面添加自定义操作按钮,以便管理员执行特定的任务。通过封装,我们可以:减少重复代码统一管理自定义操作的逻辑提高代码的可维护性和可扩展性©ivwdcwso(ID:u012172506)2.CustomActionMixin的实现让我们看看C......