欢迎光临
我们一直在努力

Kotlin Multiplatform for OpenHarmony 实战:kotlinx-bignum 任意精度大整数适配

在这里插入图片描述

本文是 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)

  • 语义层(零 @kit.*):BigInteger 用 sign + 小端幅度数组承载,add/subtract/multiply 全用竖式算法,不依赖任何系统能力。
  • 引擎层(无系统桥接):OhosBignumEngine 提供 factorial/pow2/parse 等常用封装,与系列纯逻辑引擎层定位一致。
  • 验收页:BignumDemo 在真机/模拟器上做 50!、2^128、超大数乘法、MAX_SAFE_INTEGER 边界。
  • 三、语义层:基 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 在鸿蒙真实可用。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 运行一切正常,都是正确的!

    六、踩坑小结

  • 基的选择是关键:基 2^16 让中间乘积落在 double 精确范围内;若选基 10^9,乘积会溢出 2^53 丢精度。
  • divMod10 的进位:rem * BIG_BASE + mag[i] 必须小于 2^53,rem < 10 保证成立。
  • mulMag 的进位传播:内层循环把 carry 累加进高位后,必须用一遍「从左到右进位传播」兜底,否则高位可能越过 BIG_BASE。
  • 严格模式禁止构造参数属性:constructor(sign, mag) 内必须显式 this.sign = sign; this.mag = mag。
  • 七、总结

    本文完整走通了 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

    赞(0)
    未经允许不得转载:171主机测评 » Kotlin Multiplatform for OpenHarmony 实战:kotlinx-bignum 任意精度大整数适配
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址