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>
相关推荐
不一样的少年_3 小时前
Chrome 插件实战:如何实现“杀不死”的可靠数据上报?
前端·javascript·监控
偶像佳沛3 小时前
JS 对象
前端·javascript
bjzhang753 小时前
使用 HTML + JavaScript 实现文件树
javascript·html·文件树
掘金安东尼3 小时前
⏰前端周刊第 452 期(2026年2月2日-2月8日)
前端·javascript·github
ArkPppp3 小时前
NestJS全栈实战笔记:优雅处理 Entity 与 DTO 的映射与字段过滤
javascript·nestjs
钟智强3 小时前
React2Shell:CVE-2025-66478 Next.js 远程执行漏洞深度分析与代码剖析
开发语言·javascript·ecmascript
Dragon Wu3 小时前
Electron Forge集成React Typescript完整步骤
前端·javascript·react.js·typescript·electron·reactjs
华仔啊3 小时前
jQuery 4.0 发布,IE 终于被放弃了
前端·javascript
空白诗4 小时前
高级进阶 React Native 鸿蒙跨平台开发:slider 滑块组件 - 进度条与评分系统
javascript·react native·react.js
晓得迷路了4 小时前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js