为什么%运算符有时输出正数而有时为负数?

时间:2017-03-08 02:37:21

标签: c# modulus

当我意识到奇怪的事情时,我正在制作一个统一的剧本,在我完成剧本后,我在视觉工作室控制台项目中测试了我的实现。

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

输出结果为:

-0.5

0.5

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

2 个答案:

答案 0 :(得分:4)

C#的%运算符实际上是一个余数 - 因此它只返回分区剩下的内容。其中最重要的部分是剩余部分仅受分子符号的影响,而不受除数的影响。

在3.5为正的情况下,3将完全分裂,剩下0.5分 - -3.5,-3将完全分开,剩下-0.5。无论是除以-1还是1都不影响两种情况下的结果,其余部分将相同,并且仅受数字本身符号的影响。

答案 1 :(得分:3)

  

两种情况下模数算子都不应该给我-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的整数)。   enter image description here

该表说明余数的符号与第一个操作数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。