Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回符号的函数_C#_.net_Math - Fatal编程技术网

C# 返回符号的函数

C# 返回符号的函数,c#,.net,math,C#,.net,Math,我知道这真的很简单,但我的大脑就是不工作。我需要一个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 public int-SignFunc

我知道这真的很简单,但我的大脑就是不工作。我需要一个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
public int-SignFunction(int-input)
{
如果(输入<0)返回-1;
如果(输入>0)返回1;
返回0;
}
公共整数签名功能(整数编号){
返回(数字>0)?
1:(数字<0)?
-1:编号;
}

这已经在框架中。只要用

此外,它还将与以下方面合作:

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

它已经存在。

如果数学符号不存在,我会这样做:

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

哈哈,这些功能中的一个我从来都不需要使用,所以我从来不知道它的存在。谢谢出于好奇,Math.Sign(0.01m)会返回什么?@icemandind:1-任何带小数点的正数(无论多么小)都返回+1。请参阅:+1,因为CompareTo的实现方式或多或少与Math.Sign相同。符号已硬编码为零;)@米凯尔:不过,比较表明有一种非常不同的用法。Math.Sign可以更好地告诉跟随您的程序员您的原始意图。严格来说,IComparable.CompareTo只要求返回的值为负、零或正以指示比较结果,而不要求结果为-1、0或1。Int16的CompareTo for shorts实现返回(int)x-(int)y for x.CompareTo(y)。事实上,要处理CompareTo的结果,您可能需要将其传递给Math.Sign以获得一个约束值。@Falmari LOL我想有人会说这是可移植到另一个可能不包括.NET Framework的C#实现的。实际上,此函数是一个标准FPU操作,因此,我不认为没有它就可以实现某个人;-)这也意味着这个实现要比API慢得多。框架就是这样做的:我怀疑Sign(int.MinValue)应该返回-1,而不是抛出OverflowException。所以也许你不应该这么做。(需要说明的是:Math.Abs(int.MinValue)应该是-int.MinValue,也就是int.MaxValue+1…哎呀)谢谢James,我不知道Abs是如何实现的。AtliB你在抽什么?Josh,把你的解决方案和BioBuckyBall解决方案比较一下。。。哪个更清晰、更高效?代码没有正确地反映意图,有一个不必要的除法和一个方法调用。与Josh over-int.MinValue相同的问题失败了。我没有投你反对票,但我认为这是一个用“聪明”的方式做事情的完美例子,没有任何好处。也就是说:将此与提供的答案进行比较。世界上没有一个程序员不理解他的版本。你的可能会引起一些混乱(不应该,但可能会)。它们的性能相同。看到这个论点了吗?@Dan我原则上同意你的观点:做事太聪明了。但对于三元表达式,我不敢苟同。我不认为它们太难理解,伊姆霍:)。但是,是的,我知道这并不像一个简单的解决方案那么容易理解。请看我对Anthony Pegram回答的评论。这是一个实现细节,Int32的CompareTo函数返回-1、1或0-不是指定的行为。它可以在不同的框架之间改变。使用Math.Sign。我在文档中读到,对于负数,Sign返回-1或更低。所以我怀疑,这是一个实现细节,它实际上返回-1,而不是一个定义的行为。因此,它是不可靠的,并且可能在不同版本之间发生变化。
public int Sign(int number)
{
    if(number==0)
       return 0;
    return number/Math.Abs(number);
}
public int SignFunction(int number) {
  return (number > 0) ? 
             1 : (number < 0) ? 
                    -1 : number;
}
return input.CompareTo(0);
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
// ....
int sign = Math.Sign(number);
return x == 0 ? 0 : x / Math.Abs(x);