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

System.Numerics.BigInteger取余运算对负数除数结果异常问题咨询

为什么C#的BigInteger在除数为负数时取模结果为正数?

这不是Bug,是.NET对System.Numerics.BigInteger取模运算的设计决策,和C#内置数值类型(如int、long)的取模行为不一致,但符合自身明确的运算规则。

核心原因:除法截断方向的差异

取模运算的结果由除法的截断方式决定,数学上始终满足公式:
被除数 = 除数 × 商 + 余数

  • 对于int等内置数值类型,除法采用向零截断:
    以10 % -3为例,10 / -3向零截断得到-3,代入公式得10 = (-3) × (-3) + (-2),因此余数为-2,这是你预期的结果。

  • 而BigInteger的除法采用向负无穷截断(地板除法):
    同样10 % -3,10 / -3向负无穷截断得到-4,代入公式得10 = (-3) × (-4) + 1,因此余数为1,也就是你看到的输出。
    再看10001 % -30,10001 / -30向负无穷截断得到-334,代入公式得10001 = (-30) × (-334) + 11,余数自然为11。

规则本质

BigInteger的取模规则是:余数的符号始终与被除数一致,而内置数值类型的余数符号与除数一致。这种设计是为了让大整数运算更贴合数学地板除法的逻辑,在处理超大整数场景时保持运算一致性。

若需匹配内置类型结果的手动调整

如果要让BigInteger的取模结果和int等类型一致,可以通过简单调整实现:

BigInteger left = 10;
BigInteger right = -3;
BigInteger remainder = left % right;
// 当被除数和除数符号相反时,调整余数
if ((left > 0 && right < 0) || (left < 0 && right > 0))
{
    remainder += right;
}
Console.WriteLine(remainder); // 输出-2,与int运算结果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:32:41