
本文是 KMP 三方库鸿蒙化适配,聚焦 kotlinx-bignum(Kotlin 官方任意精度算术库)的 OpenHarmony 适配。我们只讲本仓库真实落地的代码,不做系列横向对比。
摘要:本文是 KMP 三方库鸿蒙化适配系列之一,聚焦 Kotlin 官方任意精度算术库 kotlinx-bignum 在 OpenHarmony 上的纯语义复刻。ArkTS 只有 number(double),无法承载大整数;本文用「基 2^16 的幅度数组 + 竖式加减乘」在纯算法层面精确实现 BigInteger,零 @kit.* 依赖。全文按三层架构展开:语义层(Bignum.ets 竖式算法)、引擎层(OhosBignumEngine 常用封装)、验收页(BignumDemo 真机验证 50!、2^128、超大数乘法、MAX_SAFE_INTEGER 边界),并附踩坑小结。
目录
- 一、为什么选它
- 二、适配总思路:三层架构(纯语义复刻,零 @kit)
- 三、语义层:基 2^16 的竖式算法
- 四、引擎层:常用封装
- 五、验收页:真机上验证
- 六、踩坑小结
- 七、总结
- 社区引导## 一、为什么选它
kotlinx-bignum 是 Kotlin 官方的任意精度算术库,核心是 BigInteger(任意精度整数)与 BigDecimal(任意精度小数)。它解决的是 JS/Number 的「安全整数」天花板——Number 只能精确表示到 2^53(9007199254740991),超过就丢精度;而区块链、加密、大数运算、金融对账等场景都需要精确大整数。
到了 OpenHarmony,ArkTS 同样只有 number(double),没有原生大整数。但大整数的算法是纯数学的——用「基 2^16 的幅度数组 + 竖式加减乘」就能精确实现 add/subtract/multiply/compareTo/toString。这与本系列「纯语义复刻」路线一脉相承:不碰任何平台 API,靠算法把能力补上。
二、适配总思路:三层架构(纯语义复刻,零 @kit)
三、语义层:基 2^16 的竖式算法
Bignum.ets 只用 number[] + 基础运算,零平台依赖(注意 ArkTS 严格模式禁止构造参数属性,字段显式赋值):
export class BigInteger {
sign: number; // 1 / -1 / 0
mag: number[]; // 小端幅度,基 2^16
multiply(o: BigInteger): BigInteger {
if (this.sign === 0 || o.sign === 0) return BigInteger.ZERO;
const sign = this.sign === o.sign ? 1 : –1;
return new BigInteger(sign, mulMag(this.mag, o.mag));
}
toString(): string {
if (this.sign === 0) return '0';
let m = this.mag;
const digits: number[] = [];
while (m.length > 0) {
const dm = divMod10(m); // 幅度除以 10,取商与余数
digits.push(dm.r);
m = dm.q;
}
digits.reverse();
return this.sign === –1 ? '-' + digits.join('') : digits.join('');
}
}
要点:
- 为什么选基 2^16:number 是 double,尾数 53 位。a[i]*b[j] 最大约 2^32,加进位后仍在 2^53 内,不会丢精度——这是竖式算法精确的前提。
- toString 用反复除 10:从最高位开始不断 divMod10,余数拼成十进制串,保证任意位数都能精确转字符串。
- add/subtract 走符号分支:同号直接加幅度、异号转成减法(幅度大者决定符号),完全符合有符号大整数语义。
四、引擎层:常用封装
OhosBignumEngine.ets 没有系统 API 可桥接,提供大数运算的便捷入口:
export class OhosBignumEngine {
factorial(n: number): BigInteger {
let r = BigInteger.ONE;
for (let i = 2; i <= n; i++) r = r.multiply(BigInteger.fromNumber(i));
return r;
}
pow2(exp: number): BigInteger {
let r = BigInteger.ONE;
const two = BigInteger.fromNumber(2);
for (let i = 0; i < exp; i++) r = r.multiply(two);
return r;
}
}
五、验收页:真机上验证
开发界面如下: 
BignumDemo.ets 四个按钮:
- 50! 精确阶乘:算出 50! 共 65 位十进制,前 20 位与后 20 位清晰显示——Number 根本无法承载。
- 2^128:精确得到 340282366920938463463374607431768211456,证明幂运算精确。
- 超大数乘法:12345678901234567890 × 98765432109876543210 得到完整约 39 位精确积——Number 会直接丢精度。
- MAX_SAFE_INTEGER 边界:2^53 + 1 用 BigInteger 得 9007199254740993(精确),而 JS 9007199254740992 + 1 得 9007199254740994(已丢精度)——直观证明大整数为何必要。
运行一遍,结果区会显示精确的大数结果,证明 kotlinx-bignum 在鸿蒙真实可用。
运行一切正常,都是正确的!
六、踩坑小结
七、总结
本文完整走通了 kotlinx-bignum 在 OpenHarmony 上的纯语义复刻路线:不依赖任何 @kit.* 系统能力,仅用「基 2^16 的幅度数组 + 竖式加减乘」就在纯算法层面精确实现了 BigInteger 的核心运算。三层架构清晰解耦——语义层负责大数算法本身,引擎层提供 factorial/pow2 等常用封装,验收页在真机上验证了 50!、2^128、超大数乘法与 MAX_SAFE_INTEGER 边界,全部结果精确无误。
这套方案的价值在于:大整数能力是纯数学的,平台差异只影响载体,不影响算法。只要选对基(2^16 保证中间乘积不溢出 double 尾数)、处理好进位传播与符号分支,就能在 ArkTS 上获得与 Kotlin 原生一致的任意精度算术。踩坑小结里的四条经验,正是后续适配其它数学类三方库时最值得复用的通用范式。
如果你正在把 Kotlin 生态的数学/加密/金融类库迁移到鸿蒙,这套「语义复刻 + 分层封装 + 真机验收」的流程可以直接照搬。
社区引导
欢迎加入 KMP&CMP 鸿蒙社区:https://atomgit.com/CPF-KMP-CMP
本适配全部源码已开源在 AtomGit:https://atomgit.com/wdracky/kmp-ohos-adapters/tree/main/kotlinx-bignum
如果你在适配过程中用到了 AI 辅助工具,推荐码道(AtomCode)专属通道 https://developer.huaweicloud.com/codeartsco.html?source=dmzntgwatomgit1&sourcead=dmzntgwatomgiths





![打卡信奥刷题(3652)用C++实现信奥题 P12076 [OOI 2025] Cute Subsequences-171主机测评](https://www.171host.com/wp-content/uploads/2026/10/20261026055333-6adeeaddd0c48-220x150.png)
