将数字的标志放到另一个数字上?

时间:2019-01-17 19:33:11

标签: c# math

我正在寻找一种简洁的方法来获取数字的正负号,并将其赋予另一个数字。

例如:

我们给了两个数字,第一个是整数1,第二个在执行时间之前是未知的。
如果未知数小于0,则我们的数字变为-1。
如果未知数大于或等于0,则我们的数字变为1。

如果我们的未知数是X:


enter image description here

代码:

int before = AnyNonzeroInt(); //for this example we will choose 1.
int X = rand(Int32.Min, Int32.Max);
int after = ...

我个人使用的是C#4.5,但是我相信一个好的解决方案将与语言无关。

我可以想到几种方法,但是所有方法都涉及if-else-case语句或三元运算符。我想要一种数学方法。

编辑:

我不喜欢三元运算符。但是,我正在使用的代码库有一组代码准则,不允许使用三元运算符,因为它们被认为会使代码更复杂(我知道我知道。我没有制定此规则)。

但是,我确实相信我会在下一次团队会议上回答这个问题及其答案,这样我才能证明我相信三元运算符的必要性。

3 个答案:

答案 0 :(得分:5)

var after = (X < 0) ? -1 : 1;

这比部门便宜,而且您的意图也很清楚

答案 1 :(得分:2)

var after = X / Math.Abs(X);

将数字本身除以1,然后将其除以绝对值可确保符号不变。请注意,此处不处理0大小写(不想除以0!)。可能需要一个if语句或三进制。

OP指出他的集合在0到-0.01之间没有数字,因此在除法之前向X添加一个小数(例如0.00001)可以解决0问题。

此外,正如其他答案/评论所提到的,这里对三元的厌恶是奇怪的。一个简单的分支分配比加法和除法便宜。

答案 2 :(得分:2)

为什么不呢?

var after = Math.Sign(x)*before;