You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中对指数形式的值执行取模(%)运算?

科学计数法形式数值的取模运算实现

问题分析

我们需要计算两个以[x, y](表示x*10^y)形式存储的大整数的取模结果,同时避免转换为普通整数(防止精度丢失)和使用BigInt(无法存入JSON)。

数学推导

设被除数为A = a * 10^m,除数为B = b * 10^n,计算A % B分三种情况:

  1. 当 m > n 时:
    将A变形为A = (a * 10^(m-n)) * 10^n,除数B为b * 10^n。此时A % B等价于[(a * 10^(m-n)) % b] * 10^n——因为10^n是公共因子,取模后的余数再乘以10^n即可得到最终结果。
  2. 当 m = n 时:
    直接计算a % b,结果为(a % b) * 10^m(若a % b = 0则结果为0)。
  3. 当 m < n 时:
    被除数A小于除数B,取模结果就是A本身,即a * 10^m。

核心难点是计算a * 10^k % b(其中k = m-n,仅m>n时需要),由于a*10^k可能是极大数,我们可以通过逐位迭代的方式计算取模,完全避免精度丢失。

实现代码

// 计算 num * 10^power % divisor,num为整数,power为非负整数,divisor为正整数
function calculateLargeMod(num, power, divisor) {
    let remainder = 0;
    // 先处理num的每一位数字
    const numStr = num.toString();
    for (const char of numStr) {
        const digit = parseInt(char, 10);
        remainder = (remainder * 10 + digit) % divisor;
        // 余数为0时后续计算不会改变结果,提前终止
        if (remainder === 0) break;
    }
    // 处理末尾的power个0,即等效乘以10^power后取模
    for (let i = 0; i < power; i++) {
        remainder = (remainder * 10) % divisor;
        if (remainder === 0) break;
    }
    return remainder;
}

// 主函数:计算两个[x,y]形式的数的取模结果
function modScientificNotation(dividend, divisor) {
    const [a, m] = dividend;
    const [b, n] = divisor;

    if (b === 0) throw new Error("除数不能为0");

    if (m > n) {
        const k = m - n;
        const partMod = calculateLargeMod(a, k, b);
        return partMod === 0 ? 0 : [partMod, n];
    } else if (m === n) {
        const modResult = a % b;
        return modResult === 0 ? 0 : [modResult, m];
    } else {
        // m < n时,余数就是被除数本身
        return [a, m];
    }
}

// 测试示例
const first_value = [1, 13]; // 1*10^13
const second_value = [5, 9]; // 5*10^9
console.log(modScientificNotation(first_value, second_value)); // 输出0,与1e13%5e9结果一致

// 另一个测试:[123, 15] % [7, 10] → 结果应为[6, 10]
console.log(modScientificNotation([123, 15], [7, 10]));

说明

  • calculateLargeMod通过逐位处理数字和后续的零,所有运算都在普通整数范围内进行,彻底避免了大数转换导致的精度丢失。
  • 最终结果返回科学计数法的数组形式,可直接存入JSON;若需要数值形式,可在结果非数组时直接使用,或对数组结果计算x * 10**y(确保数值在安全整数范围内时)。

内容的提问来源于stack exchange,提问作者HyperKNF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:50:00