Math.js封装工具库(解决前端因为浮点数导致计算错误)

概述

该工具库是基于 mathjs 封装的一个数学计算工具,主要解决 JavaScript 浮点数运算精度问题,提供精确的加减乘除、取模等运算功能,特别适合财务、金融等需要高精度计算的场景。

安装与使用

安装依赖

bash 复制代码
npm install mathjs --save

使用

utils/math.js

js 复制代码
import * as $math from "mathjs";

export const math = {
  add() {
    return comp("add", arguments);
  },
  subtract() {
    return comp("subtract", arguments);
  },
  multiply() {
    return comp("multiply", arguments);
  },
  divide() {
    return comp("divide", arguments);
  },
  mod() {
    return comp("mod", arguments);
  },
  divMod(a, b) {
    const quotient = $math.floor(
      $math.divide($math.bignumber(a), $math.bignumber(b))
    ); // 使用 floor 获取整数部分
    const remainder = $math.mod($math.bignumber(a), $math.bignumber(b));
    return [parseFloat(quotient), parseFloat(remainder)];
    // return {
    //   quotient: parseFloat(quotient),
    //   remainder: parseFloat(remainder),
    // };
  },
  // 处理大数字
  bignumber(string) {
    return $math.bignumber(string).toNumber();
  },
  // 比大小
  compare(a, b) {
    const numA = $math.bignumber(a);
    const numB = $math.bignumber(b);

    if ($math.equal(numA, numB)) {
      return 0; // 相等
    } else if ($math.smaller(numA, numB)) {
      return -1; // a < b
    } else {
      return 1; // a > b
    }
  },
};

function comp(_func, args) {
  let t = $math.chain($math.bignumber(args[0]));

  for (let i = 1; i < args.length; i++) {
    const arg = args[i] || 0;
    t = t[_func]($math.bignumber(arg));
  }
  // 防止超过6位使用科学计数法
  return parseFloat(t.done());
}

// 使用场景
// import { math } from '@/utils/math.js'
// 加法
//    const result  = math.add(2, 3)  // 5
// 减法
//    const result  = math.subtract(3, 2)   // 1
// 乘法
//     const result  = math.multiply(2, 3) // 6
// 除法
//       const result = math.divide(4, 2) // 2
// 除余
// const result = math.mod(10, 3); //1
// 除余方法
//  math.divMod(10, 3);  // 输出: { quotient: 3, remainder: 1 }
// 可以多个
//    const result  = math.multiply(3, 2, 2, 2)   // 24
// 取决于math.js文件里面的命名,PS:中间是逗号

demo.vue

html 复制代码
<template>
  <div>
    <div>除法</div>
    <p>{{ number01 }}</p>
    <p>{{ number1 }}</p>
    <div>乘法</div>
    <p>{{ number02 }}</p>
    <p>{{ number2 }}</p>
    <div>加法</div>
    <p>{{ number03 }}</p>
    <p>{{ number3 }}</p>
    <div>减法</div>
    <p>{{ number04 }}</p>
    <p>{{ number4 }}</p>
    <div>多个计算</div>
    <p>{{ number5 }}</p>
  </div>
</template>

<script>
import { math } from "@/utils/math.js";
export default {
  data() {
    return {
      number1: 0,
      number01: 0,
      number02: 0,
      number2: 0,
      number03: 0,
      number3: 0,
      number04: 0,
      number4: 0,
      number5: 0,
    };
  },
  mounted() {
    this.divide();
    this.multiply();
    this.add();
    this.subtract();
    this.multiplys();
  },
  methods: {
    divide() {
      this.number01 = 6.1 / 0.1; // 60.99999999999999
      this.number1 = math.divide(6.1, 0.1); // 61
    },
    multiply() {
      this.number02 = 23 * 2.4; // 55.199999999999996
      this.number2 = math.multiply(23, 2.4); // 55.2
    },
    add() {
      this.number03 = 0.1 + 0.2; // 0.30000000000000004
      this.number3 = math.add(0.1, 0.2); // 0.3
    },
    subtract() {
      this.number04 = 0.8 - 0.7; // 0.10000000000000009
      this.number4 = math.subtract(0.8, 0.7); // 0.1
    },
    multiplys() {
      this.number5 = math.multiply(3, 2, 2, 2); // 24
    },
  },
};
</script>
相关推荐
ShineWinsu5 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
szp20059 小时前
Cache API 会丢掉 URL 里的 #:我的 9 个模型分块一直写在同一条缓存上
javascript·浏览器
keyipatience9 小时前
TypeScript学习(1)
前端·javascript·学习·typescript·html·css3
xifangge202510 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript
honkun610 小时前
vue 表格组件 vxe-table 修改滚动条样式,修改滚动条样式,统一宽度、颜色与自动隐藏
前端·javascript·vue.js
FRing0311 小时前
JavaScript入门到精通二十四(正则表达式、元字符、修饰符)
开发语言·前端·javascript·正则表达式
大明二代12 小时前
从 RAG 到有记忆的 Agent:Mastra Memory 与 PostgreSQL 实战
前端·javascript·人工智能
小羊没烦恼!12 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
OpsEye13 小时前
模型能力波动怎么办?网关侧做模型质量监控与自动切换
javascript·ai编程
西红柿炖牛腩35415 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端