更新记录

1.0.3(2026-08-28) 下载此版本

修复部分计算后还是精度丢失的问题

1.0.2(2022-10-21) 下载此版本

numDiv(187.2, 100) 修复bug

1.0.1(2022-01-24) 下载此版本

修复部分数字运算bug

查看更多

平台兼容性

uni-app(5.24)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - -

其他

多语言 暗黑模式 宽屏模式
× ×

nl-precisionNum 前端数字精度计算

nl-precisionNum 是一个无第三方依赖的轻量级十进制计算工具,用于减少 JavaScript 浮点数加、减、乘、除时出现的精度误差。

功能特点

  • 提供加法、减法、乘法和除法。
  • 支持 number 和数字字符串。
  • 支持 1e-7 等科学计数法。
  • 支持负数。
  • 空字符串、nullundefined 按照 0 处理。
  • 不采集数据,不申请权限,不访问网络。
  • 支持 Vue 2、Vue 3、App、H5 和主流小程序。

安装

将插件安装到项目的 uni_modules/nl-precisionNum 目录即可,无需在 main.js 中注册。

引入

import {
  numAdd,
  numSub,
  numMulti,
  numDiv
} from '@/uni_modules/nl-precisionNum/js_sdk/nl-precisionNum.js'

基础示例

numAdd(0.1, 0.2)        // 0.3
numSub(1, 0.9)          // 0.1
numMulti(0.7, 1.05)     // 0.735
numDiv(187.2, 100)      // 1.872

数字字符串

接口或输入框返回数字字符串时可以直接参与计算:

numAdd('100.10', '0.20') // 100.3
numMulti('12.5', '2')    // 25

科学计数法

numAdd(1e-7, 2e-7)  // 3e-7
numMulti(1e-7, 3)   // 3e-7

连续汇总

const amounts = [0.1, 0.2, 10.35]

const total = amounts.reduce((sum, amount) => {
  return numAdd(sum, amount)
}, 0)

console.log(total) // 10.65

API

numAdd(a, b)

计算 a + b

numAdd(12.30, 0.15) // 12.45

numSub(a, b)

计算 a - b

numSub(12.30, 0.15) // 12.15

numMulti(a, b)

计算 a * b

numMulti(12.30, 0.15) // 1.845

numDiv(a, b)

计算 a / b

numDiv(187.2, 100) // 1.872

除数为 0 时保持 JavaScript 的原生结果:

numDiv(1, 0) // Infinity
numDiv(0, 0) // NaN

入参处理

入参 处理结果
有限数字 正常参与计算
数字字符串 转换为数字后参与计算
空字符串 0 处理
null 0 处理
undefined 0 处理
非数字字符串 返回 NaN
Infinity 返回 NaN

金额显示

本插件负责计算,不会强制保留两位小数。金额展示时可以在计算完成后格式化:

const amount = numAdd(10.1, 20.2)
const displayAmount = amount.toFixed(2)

console.log(displayAmount) // 30.30

不要在每一步计算前调用 toFixed,因为 toFixed 返回字符串。建议完成全部计算后,仅在界面展示阶段格式化。

从原工具文件迁移

原来的引入方式:

import { numAdd } from '@/utils/precisionNum.js'

修改为:

import { numAdd } from '@/uni_modules/nl-precisionNum/js_sdk/nl-precisionNum.js'

四个方法的名称和返回类型保持不变,其余业务代码无需调整。

精度边界

插件返回值类型仍然是 JavaScript Number。当整数或中间计算值超过 9007199254740991 时,JavaScript 本身无法保证整数绝对精确,插件会降级使用原生计算并清理常见的浮点尾数。

对于超大金额或要求任意位数绝对精确的业务,建议后端以字符串或最小货币单位保存,并使用专门的大数十进制方案。

发布到插件市场

在 HBuilderX 中右键点击 uni_modules/nl-precisionNum 目录,选择发布到插件市场。

当前插件 ID 为 nl-precisionNum。如果后续调整插件 ID,需要同步修改以下内容:

  1. 插件目录名称。
  2. package.json 中的 id
  3. js_sdk/nl-precisionNum.js 文件名。
  4. 文档和项目中的导入路径。

隐私与权限

  • 插件不采集、存储或上传任何数据。
  • 插件不申请系统权限。
  • 插件不包含广告。
  • 插件不依赖 uniCloud、图床或远程服务。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议