【问题标题】:Why does the % operator sometimes output positive and sometimes negative?为什么 % 运算符有时会输出正数,有时会输出负数?
【发布时间】:2017-07-28 11:13:44
【问题描述】:

当我意识到一些奇怪的事情时,我正在统一编写脚本,完成脚本后,我在 Visual Studio 控制台项目中测试了我的实现。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(-3.5 % 1);
        Console.WriteLine(3.5 % (-1));
    }
}

输出是:

-0.5

0.5

模数运算符不应该在两种情况下都给我 -0.5 吗?

【问题讨论】:

标签: c# modulus


【解决方案1】:

C# 的 % 操作符实际上是一个余数——所以它只是返回除法的余数。其中最重要的部分是余数只受分子符号的影响,而不受除数的影响。

在 3.5 为正的情况下,3 将完美分割,剩余 0.5 -- 使用 -3.5,-3 将完美分割,剩余 -0.5。无论您除以 -1 还是 1 都不会影响任何一种情况下的结果,余数将相同,并且仅受数字本身的符号影响。

【讨论】:

  • 并非如此。取模主要是一种计算的东西,不同的编码语言在实现方式上存在差异。很高兴知道您当前的语言在应用时采用了哪种方法。
【解决方案2】:

模数运算符不应该在两种情况下都给我 -0.5 吗?

为什么要这样做?从数学上讲,两种情况下 0.5 和 -0.5 都是正确的。

-3.5 = -3 * 1 + (-0.5)
-3.5 = -4 * 1 + 0.5
3.5 = -3 * (-1) + 0.5
3.5 = -4 * (-1) + (-0.5)

以编程方式,它由 C# 语言规范定义。

7.8.3 余数运算符

浮点余数:

float operator %(float x, float y);
double operator %(double x, double y); 

下表列出了所有可能组合的结果 非零有限值、零、无穷大和 NaN。在表中,x 和 y 是正有限值。 z 是 x % y 的结果并且是 计算为 x – n * y,其中 n 是可能的最大整数,即 小于或等于 x / y。这种计算余数的方法是 类似于用于整数操作数,但不同于 IEEE 754定义(其中n是最接近x/y的整数)。

表格说余数的符号与第一个操作数x的符号相同。

-3.5 % 1的情况下:

x = 3.5
y = 1
n = 3
z = 3.5 - 3 * 1 = 0.5

根据表格,结果为-z,即-0.5。

3.5 % -1xynz的情况同上。根据表,结果为+z,即0.5。

【讨论】:

  • 谢谢,我会保留表格作为参考。
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 2020-09-29
  • 2019-11-13
  • 2020-09-06
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多