我正在寻找一种简洁的方法来获取数字的正负号,并将其赋予另一个数字。
我们给了两个数字,第一个是整数1,第二个在执行时间之前是未知的。
如果未知数小于0,则我们的数字变为-1。
如果未知数大于或等于0,则我们的数字变为1。
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语句或三元运算符。我想要一种数学方法。
我不喜欢三元运算符。但是,我正在使用的代码库有一组代码准则,不允许使用三元运算符,因为它们被认为会使代码更复杂(我知道我知道。我没有制定此规则)。
但是,我确实相信我会在下一次团队会议上回答这个问题及其答案,这样我才能证明我相信三元运算符的必要性。
答案 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;