英文:
Numerics BigInteger.Remainder (Mod) doesn't work with negative divisors
问题
考虑以下方程:
10 % 3 = 1
10 % -3 = -2
10001 % 30 = 11
10001 % -30 = -19
C#的System.Numerics.BigInteger似乎对负除数产生正结果,就好像在计算中使用了Abs(divisor)
之类的东西;例如:
10 % -3
BigInteger left = 10;
BigInteger right = -3;
Console.WriteLine(left % right); // 1,但应该是 -2
10001 % -30
BigInteger left = 10001;
BigInteger right = -30;
Console.WriteLine(left % right); // 11,但应该是 -19
为什么会这样?这是一个错误吗?
英文:
Consider the following equations:
10 % 3 = 1
10 % -3 = -2
10001 % 30 = 11
10001 % -30 = -19
C#'s System.Numerics.BigInteger Seems to produce positive results for negative divisors, as if something like Abs(divisor)
has been used in the calculation; for example:
10 % -3
BigInteger left = 10;
BigInteger right = -3;
Console.WriteLine(left % right); // 1, but should be -2
10001 % -30
BigInteger left = 10001;
BigInteger right = -30;
Console.WriteLine(left % right); // 11, but should be -19
Why is this? Is this a bug?
答案1
得分: 2
Modulus/remainder 操作在不同的编程语言中可以对负数操作数有不同的行为。
.NET 一贯遵循 BigInteger 文档 中指定的约定:
模数操作返回的值的符号取决于
dividend
的符号:如果dividend
是正数,则模数操作返回正数结果;如果是负数,则模数操作返回负数结果。对于BigInteger
值的模数操作行为与其他整数类型的模数操作相同。
因此,您应该在 int
、long
等类型中看到相同的行为,但这可能与其他平台(例如 Wolfram Alpha)的行为不同。在 .NET 中与 Java 相同 - 来自 JLS remainder operator 文档:
从这个规则可以得出,余数操作的结果只有在被除数为负数时才能为负数,只有在被除数为正数时才能为正数。此外,结果的大小始终小于除数的大小。
英文:
Modulus/remainder operations can have different behaviors with negative operands in different programming languages.
.NET consistently follows the convention specified in the BigInteger documentation:
> The sign of the value returned by the modulus operation depends on the sign of dividend
: If dividend
is positive, the modulus operation returns a positive result; if it is negative, the modulus operation returns a negative result. The behavior of the modulus operation with BigInteger
values is identical to the modulus operation with other integral types.
So you should see the same behavior with int
, long
etc - but that may be different behavior to other platforms (e.g. Wolfram Alpha). It happens to be the same in .NET as in Java - from the JLS remainder operator docs:
> It follows from this rule that the result of the remainder operation can be negative only if the dividend is negative, and can be positive only if the dividend is positive. Moreover, the magnitude of the result is always less than the magnitude of the divisor.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论