2017-03-08 111 views
3

当我意识到一些奇怪的事情并且在完成脚本之后,我正在编写一个脚本,我在一个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?

+0

它返回余数。 Eric Lippert在其上的某个地方有一个很好的博客文章 – pinkfloydx33

+1

仅供参考,这不是C#独有的。 SQL Server的行为相同。 – Tim

+0

博客帖子btw:https://blogs.msdn.microsoft.com/ericlippert/2011/12/05/whats-the-difference-remainder-vs-modulus/ – pinkfloydx33

回答

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的最大可能整数,其为 。这种计算余数的方法与用于整数操作数的方法类似,但与定义(其中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。

+0

谢谢,我会保留表格作为参考。 –

4

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

在3.5积极的情况下,3将完美分割,剩余0.5分 - 与-3.5,-3将完美分割,剩余-0.5。在这两种情况下,除以-1还是1都不会影响结果,其余部分将是相同的,只受数字本身的符号影响。

+0

数学中是否有通用的%(mod)标准? –

+0

不是。 Modulo主要是一种计算方面的东西,编码语言之间的差异在于它如何实现。只需知道当前语言应用哪种方法即可。 –

相关问题