个人文档
  • AI编程Cursor
  • GPT使用笔记
  • npm常用库合集
  • 同步用
  • 小Demo们
  • 工具网站教程集合
  • HTML、CSS 工具方法集合
    • HTML 全局属性
    • css常用功能
    • font-face 字体|子集相关
    • iframe父子页面传值
    • input输入优化
    • loading状态
    • nodejs使用谷歌邮箱发邮件
    • 为 Dom 自定义事件监听
    • 初始html的head标签配置
    • 拼音输入中文汉字的事件监听
    • 文字颜色效果
    • 文档片段范围 Range
    • 移动端开发-rem
    • 等宽字体推荐
    • 网站SEO优化注意点
    • 邮件html模板
  • JS 工具方法集合
    • Axios 简单使用
    • Axios 简单封装
    • Gitbook的安装和使用
    • Github 登录开发
    • HTML转为纯文本
    • JS 中强大的操作符
    • cookie 操作
    • js 动态加载js资源
    • js 常用功能语句
    • js取代trycatch的方法封装
    • js接口下载二进制
    • script 标签的异步属性
    • 判断当前是移动端还是pc端
    • 刷新token队列管理
    • 前端多线程 Web Worker
    • 加密-AES对称加密
    • 加密-node进行rsa加密解密
    • 地区省市区三级联动的地址数据 + 功能
    • 复制插件
    • 开发时环境变量
    • 得到随机图片
    • 数字格式整理集合
    • 数学计算插件
    • 时间格式整理
    • 获取ip地址
    • 获取url传参
    • 进制转换和位运算符
    • 页面隐藏|激活|关闭的监听
  • JS 知识点研究
    • Babel 历史和原理
    • Babel 配置和使用
    • Function 的 apply、call、bind
    • HTTP浏览器缓存粗解
    • Source map 文件还原为源码
    • TS常用技巧
    • js 的加载和模块化
    • js 的新数据类型 Symbol
    • js的代理对象 proxy 和 defineProperty
    • js的原型链 prototype
    • vite 打包体积优化
    • webpack 可视化打包文件大小插件
    • webpack 基础使用配置
    • webpack 版本5的报错
    • yeoman 开发脚手架的工具
    • 同步异步和微任务宏任务
    • 移动端调试---谷歌工具+eruda+vconsole
    • 转换-Blob URL
    • 转换-FileReader
    • 转换-Js文件类型和转换
    • 转换-前端开发的URL的编码和解码
    • 转换-字符串和Base 64的转换
  • Node 和 Npm 相关
    • Node 开发环境配置
    • express + jwt 校验
    • node 常用方法
    • node后台服务器-PM2
    • node基本使用
    • npm 中依赖的版本问题
    • npm 功能使用
    • npm指令说明和其他对比
    • nvm版本管理+自动切换node版本
  • React 学习
    • React Hook
    • React 项目基础开发
    • React.memo 和 React.PureComponent
    • React懒加载进阶
    • useContext Hook
    • useEffect Hook
    • useMemo 和 useCallback - Hook
    • useRef Hook
    • useState Hook
    • 同步修改变量功能封装 useVal for react
    • 轻便的传值组件
  • Rust 语言相关
    • Rust 基本
    • Rust 基础学习
    • Rust 调用 Object-C 的API
    • Tauri 基本使用
    • Tauri 是什么
  • VUE 学习
    • Vue3 使用
    • Vue3使用hook
    • Vue开发小技术点
    • vue路由切换时的动画效果
    • 花式引入组件和资源-打包时拆包减少js体积
  • Web3相关
    • Web3.0开发上-准备和概念理解
    • Web3.0开发下-功能代码示例
    • 以太坊区块链和Web3.0
    • 开发智能合约
  • python
    • pyenv版本管理工具
    • python初始化
    • python基本概念
    • venv虚拟环境
  • 个人其他
    • Steam Deck的基本设置和插件
  • 其他编程相关
    • Git教程和常用命令
    • Java开发-JDK和Maven的安装和卸载
    • Jenkins安装和基本使用
    • Linux系统指令
    • Mac 使用2K屏幕开启缩放
    • Mac 使用VS code打开项目
    • Mac 安装 Homebrew
    • Mac 的终端 shell 与 zsh
    • Mac 软件和插件
    • MacBook使用建议
    • Mac升降级到指定版本的系统
    • Mac安装Zsh
    • Mac安装软件各种提示
    • Mac系统脚本语言 AppleScript 的使用
    • Mac终端代理工具
    • Markdown(md)文档开发-Typora
    • Mysql 的安装和使用
    • Nginx 安装和基础使用
    • Nginx 稍微高深的配置
    • Slate - Api 的文档开发工具
    • Sublime配置
    • Ubuntu的 apt-get 使用
    • VScode配置
    • Windows 软件和插件
    • curl 工具使用
    • github 网站访问优化
    • host 文件
    • inquirer 终端中和用户交互
    • uTools的插件开发教程
    • vim 文本编辑功能
    • 使用 Github Pages 免费部署网站
    • 压缩指令 zip 和 unzip
    • 油猴的安装和开发(Tampermonkey)
    • 阿里云简略使用
  • 微信开发
    • 微信小程序开发
    • 微信开发必读
    • 微信开发提前购买域名
    • 微信手机打开的页面中授权登录
    • 微信扫码登录
    • 微信服务号登录+推送服务提醒
    • 自定义分享卡片-node.js实现
  • 数据结构与算法
    • KMP算法
    • Wildcard字符串分析算法
    • 二叉树
    • 字典树
    • 时间复杂度浅析
    • 算法神器——动态规划
Powered by GitBook
On this page
  • 数学计算插件
  • decimal.js、bignumber.js和big.js
  • mathjs(不推荐)

Was this helpful?

  1. JS 工具方法集合

数学计算插件

title: 数学计算插件 id: e23f34fe25eb7d2c322f40cc05657d80 tags: [] date: 2000/01/01 00:00:00 updated: 2024/01/13 21:10:53 isPublic: true --#|[分隔]|#--

数学计算插件

js一直存在一个 0.1 + 0.2 !== 0.3 的问题。

官方解答是类似js在计算时,会把数字转为二进制进行计算,而一些小数转为二进制时,是一个无尽的类似「00100000100...」的值,真正计算后再转为十进制,就会失去精度的一个说法。

反正结果就是,js不能用来直接计算小数。

所以下面这几个插件,给经济金融股票相关的页面开发者省太多头发了。

decimal.js、bignumber.js和big.js

这三个插件是同一个作者开发的,所以使用的逻辑几乎一样,区别就是适用的方面和API数量不同。

  • decimal.js:超出js安全数值范围会失去精度,大多数时适用

  • bignumber.js:超出js安全数值范围也不会失去精度,适合财务计算时使用

  • big.js:类似bignumber.js,但API方法数量比较少

这几个插件,加减乘除需要调用不同方法,虽然主要使用 加减乘除,但这个插件内部的方法还是挺多的。

  • 官方地址Github(可下载单文件 js 来静态使用)

  • 所有 Api 方法。

安装三者的方法

三个方法,使用其中一个即可,正常可以使用decimal.js,但当进行财务计算、web3区块链、虚拟币相关时,可以使用bignumber.js或big.js。

npm install --save decimal.js

npm install --save bignumber.js

npm install --save big.js
# 如果使用ts,big.js需要手动自行安装
npm install --save-dev @types/big.js

引入

// 方式一
import { Decimal } from 'decimal.js';
import { BigNumber } from 'bignumber.js';
import { Big } from 'big.js';

// 方式二
const Decimal = require('decimal.js');
const BigNumber = require('bignumber.js');
const Big = require('big.js');

使用举例

使用时,建议传数字字符串,避免当数字过大或者过小时,超过js数字安全范围,值的某些位数被替换为0。

// 先声明再使用,建议传入数字字符串
let decimal = new Decimal('0.8');
// 可以直接传入科学计数法
decimal = new Decimal('1.2e+21');

decimal.toFixed() // 得到值,四舍五入,可转为原数值的字符串格式(避免被科学计数法)
decimal.toExponential() // 得到值,强制使用科学计数法表示
decimal.round(2) // 四舍五入到某一位数
decimal.plus('1.23') // 加法
decimal.minus('1.23') // 减法
decimal.times('1.23') // 乘法
decimal.div('1.23') // 除法
decimal.mod('1.23') // 取余
decimal.sqrt() // 开平方根
decimal.pow(2) // 返回原值的 n 次幂
decimal.abs() // 取绝对值
decimal.neg() // (BigNumber不支持)取负值
decimal.cmp('1.23') // (BigNumber不支持)比较大小,1: 比传入的值大,-1: 比传入的值小
decimal.equals(new Decimal('1.23')) // (BigNumber和Big不支持)是否相等 true 或 false

// 截取到固定小数位,仅 decimal.js 的写法
decimal.toDP(2, Decimal.ROUND_DOWN)
// 截取到固定小数位,仅 bignumber.js 的写法
decimal.decimalPlaces(2, BigNumber.ROUND_DOWN)
// 截取到固定小数位,big.js不支持

mathjs(不推荐)

这个插件体积比较大,查看过压缩版的js,体积还有500多k,建议使用另一 decimal.js,体积只有32k。

官方教程说,可以不进行初始化,直接使用evaluate方法,比如evaluate('0.1 + 0.7')的方式使用,但我实测,发现无法解决小数失去精度的问题,所以还是需要初始化一下。

github:https://github.com/josdejong/mathjs

使用编译工具

安装插件

npm install mathjs -S

初始化和配置插件

// Math.js

// 引入插件
import { create, all } from 'mathjs';

// 初始配置
const mathjs = create(all);
mathjs.config({ number: 'BigNumber' });

// 生成方法
const computedMath = (str) => {
try {
  let num = `${mathjs.evaluate(str)}`
  return num
} catch(err) {
  // eslint-disable-next-line
  console.error('math.js中出错', err)
  return '0'
}
}

// 导出
export default computedMath;

使用方法

// 使用
import computedMath from './Math.js'

// 直接把数学公式的字符串,放进去计算即可
let result = computedMath('0.1 + 0.2') // => 0.3

// 除了上面简单的加法,还可以把更复杂的公式放进去,比如 `(11 * 23 + 23) / 123 * 22` 类似的式子

// 当然这个插件也不是只有这点东西,是一个很完备功能强大的插件据说可以完全取代js中的 Math 对象,有兴趣的可以深入研究一下

使用静态HTML

使用静态html,就不能使用npm,也不能使用es6语法,那么就引入插件js。

下载此插件js:https://unpkg.com/mathjs/dist/math.min.js,然后引入:

<script src="./math.min.js"></script>

初始化插件,可以暴露出一个方法到window上,或者其他调用方式都可以

// 初始配置
var mathjs = math.create(math.all);
mathjs.config({ number: 'BigNumber' });

// 生成方法
window.computedMath = function(str) {
try {
  let num = String(mathjs.evaluate(str))
  return num
} catch(err) {
  console.error('math.js中出错', err)
  return '0'
}
}
Previous数字格式整理集合Next时间格式整理

Last updated 3 months ago

Was this helpful?