更新记录

1.0.0(2026-07-19)

首发:自研高性能原生金融级任意精度十进制核心,提供 uni-app 可调的 JS API。


平台兼容性

uni-app x(5.14)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0 12 × ×

nex-decimal —— 金融级任意精度十进制计算

自研高性能原生金融精算核心,提供 uni-app 可调的 JS API。 支持 App 端(Android / iOS)H5 端17 个 API 全量可用; H5 端建议应用启动时 await ensureReady() 一次);小程序不支持。

同一份 utssdk 插件同时支持 uni-app x(uvue)经典 uni-app(vue3),无需分叉。 全程 string 进 string 出:金额/数字用十进制字符串承载,避免 f64 精度丢失—— 0.1 + 0.2 在 JS(IEEE-754 f64)下等于 0.30000000000000004,本插件 decAdd("0.1","0.2") 精确返回 "0.3"。 自研核心,无额外系统依赖。适用:电商金额、账单、利息、汇率、报表合计等不容精度误差的场景。

为什么需要它

JavaScript 的 number 是双精度浮点,做金额运算会丢精度(0.1+0.20.3-0.11.1*3 都不准), 四舍五入、银行家舍入、千分位格式化也要自己拼。本插件把这些交给原生定点十进制核心,精确、可控、一致。

API(17 个)

JS API 签名 说明
算术 decAdd decAdd(a, b): string a + b(去尾随零)
decSub decSub(a, b): string a - b
decMul decMul(a, b): string a × b
decDiv decDiv(a, b, scale?, rounding?): string a ÷ b,默认 scale=28、rounding="HalfUp";除零抛错
decCompare decCompare(a, b): number a<b→-1 / 相等→0 / a>b→1("2.50"=="2.5")
舍入/符号 decRound decRound(a, scale, rounding): string 舍入到 scale 位,精确保留 scale(补零)
decAbs decAbs(a): string 绝对值
decNeg decNeg(a): string 取负
聚合 decSum decSum(values): string 求和(空数组抛参数错误)
decAvg decAvg(values, scale?, rounding?): string 平均=和/个数
decMax decMax(values): string 最大值
decMin decMin(values): string 最小值
格式化/利息 decFormat decFormat(a, scale, thousandsSep, currencySymbol): string 货币格式化(千分位 + 货币符号)
compoundInterest compoundInterest(principal, annualRate, periodsPerYear, years): string 复利终值(本息合计)
simpleInterest simpleInterest(principal, annualRate, years): string 单利终值(本息合计)
表达式 decEval decEval(expr): string 求值算术表达式串,全程 Decimal(去尾随零)
decEvalScale decEvalScale(expr, scale, rounding): string 求值后舍入到 scale(精确补零)

scale/periodsPerYear/years 传 number(整数);thousandsSep 传 boolean;values 传 string[]。

舍入策略(rounding 参数)

"HalfUp"(四舍五入,远离零)| "HalfEven"(银行家,就近偶数)| "HalfDown"(中点趋零)| "Up"(远离零)| "Down"(趋零截断)| "Ceiling"(向正无穷)| "Floor"(向负无穷)。非法名抛参数错误。

经典对照:decRound("2.5",0,"HalfUp")=="3"decRound("2.5",0,"HalfEven")=="2"

用法

import {
  decAdd, decDiv, decRound, decSum, decFormat, compoundInterest
} from '@/uni_modules/nex-decimal';

// 浮点陷阱终结者
decAdd('0.1', '0.2');            // "0.3"(JS: 0.1+0.2 = 0.30000000000000004)
decSum(['19.99', '0.01', '5']);  // "25"

// 除法:4 位小数、四舍五入
decDiv('1', '3', 4, 'HalfUp');   // "0.3333"
decDiv('1', '3');                // 默认 28 位

// 舍入(精确保留 scale,补零)
decRound('1.5', 2, 'HalfUp');    // "1.50"

// 货币格式化
decFormat('1234.5', 2, true, '¥');   // "¥1,234.50"
decFormat('-1234567.891', 2, true, '$'); // "-$1,234,567.89"

// 复利:本金 1000、年利率 5%、按月复利、1 年
const amount = compoundInterest('1000', '0.05', 12, 1); // ≈ 1051.16189...
decRound(amount, 2, 'HalfUp');   // "1051.16"

// 表达式引擎:把整条算式当字符串求值,全程 Decimal(非 f64)
decEval('0.1+0.2');              // "0.3"
decEval('1+2*3');               // "7"(优先级)
decEval('(1+2)*3');             // "9"
decEval('2^10');                // "1024"(幂,整数指数)
decEval('1.1*(2+3.5)/7');       // 全精度小数
decEval('abs(-5)');             // "5";也支持 sqrt(x)/round(x,n)
decEvalScale('10/3', 2, 'HalfUp'); // "3.33"(求值后舍入到 2 位)

错误处理

可失败函数在原生层抛异常(Android DecException / iOS DecError),UTS 侧透传,用 try/catch 捕获:

try {
  decDiv('1', '0');          // 抛 DivideByZero
} catch (e) {
  console.error(e);
}
  • 非法数字串(空串 / 非数字 / 溢出)→ InvalidNumber
  • 除数为零 → DivideByZero
  • 舍入模式名非法 / scale 超 28 / 聚合空数组 / periodsPerYear=0InvalidParam
  • 表达式语法错误(括号不匹配 / 尾随运算符 / 空表达式 / 未知函数 / 非整数指数 / 嵌套过深)→ InvalidParam;表达式含非法字符或无法解析的数字 → InvalidNumber;表达式里除零 → DivideByZero

边界 / 限制

  • Decimal 量程约 ±7.9×10²⁸、最多 28 位小数;超出即溢出 → InvalidNumber(不会 panic / 闪退)。
  • 利息函数返回全精度结果(复利可达多位小数),按需用 decRound / decFormat 收口到展示精度。
  • simpleInterest / compoundInterest 返回的是本息合计(最终金额),不是单纯利息。
  • App 端(Android / iOS)+ H5 端可用;小程序不支持。

质量与验证

  • 所有运算溢出安全:溢出返回可捕获错误、绝不闪退;表达式引擎带深度守卫,深嵌套报错而非栈溢出。
  • 50 项自动化测试全量通过(含 0.1+0.2、银行家舍入、复利手算锚、除零,及表达式优先级/幂/函数/语法错误/深嵌套等金标)。
  • App 端为原生插件,需自定义基座或云打包运行。

隐私、权限声明

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

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

插件不采集任何数据。所有计算/处理均在本地完成,无任何网络请求、不发送数据到任何服务器。

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

暂无用户评论。