返回符号的函数

问题描述:

我知道这确实会变得很简单,但我的大脑却无法正常工作。我需要一个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 

这已经是在框架中。只需使用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

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

见我的安东尼Pegram的答复意见。这是Int32的CompareTo函数返回-1,1或0的实现细节 - 不是指定的行为。它可以在框架之间改变。使用Math.Sign。 – 2010-07-16 01:56:13

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

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

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://*.com/questions/3259509/a-function-to-return-a-sign/3259528#3259528)。世界上的程序员不会理解他的版本。你的问题可能会引起一些混淆(不应该,但可能)。他们执行相同的操作。看到参数? – 2010-07-15 22:05:06

+0

@丹我原则上同意你*做事太巧妙。但我不同意三元表达。我不认为他们太难理解,恕我直言:)。但是,是的,我可以看到这不像一个简单明了的解决方案那样容易理解。 – 2010-07-15 22:38:19

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

int sign = Math.Sign(number); 

它已经存在。

如果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