更新记录
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.2、0.3-0.1、1.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=0→InvalidParam。 - 表达式语法错误(括号不匹配 / 尾随运算符 / 空表达式 / 未知函数 / 非整数指数 / 嵌套过深)→
InvalidParam;表达式含非法字符或无法解析的数字 →InvalidNumber;表达式里除零 →DivideByZero。
边界 / 限制
Decimal量程约 ±7.9×10²⁸、最多 28 位小数;超出即溢出 →InvalidNumber(不会 panic / 闪退)。- 利息函数返回全精度结果(复利可达多位小数),按需用
decRound/decFormat收口到展示精度。 simpleInterest/compoundInterest返回的是本息合计(最终金额),不是单纯利息。- App 端(Android / iOS)+ H5 端可用;小程序不支持。
质量与验证
- 所有运算溢出安全:溢出返回可捕获错误、绝不闪退;表达式引擎带深度守卫,深嵌套报错而非栈溢出。
- 50 项自动化测试全量通过(含 0.1+0.2、银行家舍入、复利手算锚、除零,及表达式优先级/幂/函数/语法错误/深嵌套等金标)。
- App 端为原生插件,需自定义基座或云打包运行。

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 1178
赞赏 0
下载 12438998
赞赏 1934
赞赏
京公网安备:11010802035340号