2010-07-15 130 views
16

我知道這確實會變得很簡單,但我的大腦卻無法正常工作。我需要一個C#中的函數,如果傳遞給該函數的整數具有負號,則返回-1;如果該整數具有正號,則返回1;如果傳遞的數字爲0,則返回0.例如:返回符號的函數

int Sign=SignFunction(-82); // Should return -1 
int Sign2=SignFunction(197); // Should return 1 
int Sign3=SignFunction(0); // Should return 0 

回答

39

這已經是在框架中。只需使用Math.Sign ...

int sign = Math.Sign(-82); // Should return -1 
int sign2 = Math.Sign(197); // Should return 1 
int sign3 = Math.Sign(0); // Should return 0 

此外,它將與工作:

int sign4 = Math.Sign(-5.2); // Double value, returns -1 
int sign5 = Math.Sign(0.0m); // Decimal, returns 0 
// .... 
+2

+1 DRY/DRTW .... – 2010-07-15 20:07:29

+0

一個完美的現有輪 – seanb 2010-07-15 20:07:55

+0

哈哈這些功能之一,我從來不需要使用,所以永遠不知道它存在。謝謝! – Icemanind 2010-07-15 20:08:18

3
public int SignFunction(int number) 
{ 
    return number.CompareTo(0); 
} 
+0

見我的安東尼Pegram的答覆意見。這是Int32的CompareTo函數返回-1,1或0的實現細節 - 不是指定的行爲。它可以在框架之間改變。使用Math.Sign。 – 2010-07-16 01:56:13

3
public int SignFunction(int input) 
{ 
    if(input < 0) return -1; 
    if(input > 0) return 1; 
    return 0; 
} 
+0

+1未使用API​​ – Falmarri 2010-07-15 20:19:13

+2

@Falmarri LOL我想可以說這是可以移植到C#的另一個實現,可能不包括.NET Framework。 – AaronLS 2010-07-15 20:25:05

+0

確實,這個函數是一個標準的FPU操作,所以我不認爲有人可以在沒有它的情況下進行實現;-)這也意味着這個實現比API要慢。 – mbq 2010-07-15 20:43:15

0
public int Sign(int number) 
{ 
    if(number==0) 
     return 0; 
    return number/Math.Abs(number); 
} 
+0

oops意外地編輯了你的解決方案! – 2010-07-15 20:05:39

+0

這沒關係,我犯了一個大錯誤;) – Gregoire 2010-07-15 20:06:59

+0

同樣的問題,因爲喬希以上 - int.MinValue失敗。 – 2010-07-15 20:44:55

2
public int SignFunction(int number) { 
    return (number > 0) ? 
      1 : (number < 0) ? 
        -1 : number; 
} 
+0

爲什麼downvote,我想知道。 – 2010-07-15 21:14:38

+0

我並沒有讓你失望,但我認爲這是一個完美的例子,它以「聰明」的方式做事,沒有任何好處。那就是:將它與[Lucas Heneks]提供的答案進行比較(http://stackoverflow.com/questions/3259509/a-function-to-return-a-sign/3259528#3259528)。世界上的程序員不會理解他的版本。你的問題可能會引起一些混淆(不應該,但可能)。他們執行相同的操作。看到參數? – 2010-07-15 22:05:06

+0

@丹我原則上同意你*做事太巧妙。但我不同意三元表達。我不認爲他們太難理解,恕我直言:)。但是,是的,我可以看到這不像一個簡單明瞭的解決方案那樣容易理解。 – 2010-07-15 22:38:19

3
return input.CompareTo(0); 
+0

+1,因爲CompareTo或多或少地以與Math.Sign相同的方式實現。 Math.Sign已將硬編碼爲零;) – 2010-07-15 20:09:08

+0

@Mikael:CompareTo暗示了一種非常不同的用法,不過。 Math.Sign會更好地告訴程序員跟蹤您的原始意圖。 – 2010-07-15 20:32:29

+0

嚴格地說,IComparable.CompareTo只要求它返回的值爲負數,零或正數以指示比較結果 - 它並不要求結果爲-1,0或1.int16的shortTo返回的實現返回(int)x - (int)y for x.CompareTo(y)。 實際上,要處理CompareTo的結果,您可能需要將它傳遞給Math.Sign以獲取約束值。 – 2010-07-16 01:52:37

7
int sign = Math.Sign(number); 

它已經存在。

1

如果Math.Sign不存在,我會做到這一點:

return x == 0 ? 0 : x/Math.Abs(x); 
+0

雖然我懷疑Sign(int.MinValue)應該返回-1,而不是拋出OverflowException。所以也許你不應該那樣做。 (要清楚:Math.Abs​​(int.MinValue)將是-int.MinValue,它是int.MaxValue + 1 ... oops) – 2010-07-15 20:43:46

+0

種效率低下且難以閱讀... – AtliB 2010-07-15 21:38:30

+0

謝謝James,I不知道Abs是如何實施的。 AtliB你在吸菸嗎? – Josh 2010-07-27 17:30:12