2017-03-08 76 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主要是一種計算方面的東西,編碼語言之間的差異在於它如何實現。只需知道當前語言應用哪種方法即可。 –

相關問題