使一个变量的值变为正数

52

我有一个变量,它有时是负数,有时是正数。

在使用之前,我需要将其变为正数。如何实现这一点?

6个回答

61

使用Math.abs方法。

下面有一条关于使用否定的评论(感谢Kelly让我思考这个问题),如果你对Math.abs函数进行一个本地引用,那么在大量转换时,使用否定会稍微快一些(没有本地引用的Math.abs速度要慢得多)。

查看这个问题的答案以获取更多详细信息。 对于小数值,两者的差异是微不足道的,我认为Math.abs是一种更加清晰的“自我记录”代码的方式。


1
使用否定代替。不需要函数调用。 https://dev59.com/CXI-5IYBdhLWcg3wu7Lv#1702175 - Kelly S. French
1
我必须在这里同意@Kevin的观点。虽然"a = -a;"是明确的,但它仍然会引发某些人(包括开发人员)的数学恐惧症。Math.abs()似乎表达了相同的意思,但使用了大脑的不同部分。我不会评论Math.abs(),但我可能会对"a = -a"进行评论。 - Kelly S. French
4
这段话有些老套,但我想指出使用 abs 而不是仅仅取反变量的原因是,如果你不知道它是正数还是负数,并且不想使用 if 语句进行检查。 - Adam Ashwal
3
@ cwallenpoole 并不是每个人都知道“绝对值”的术语。 - callum
@callum 但每个程序员都应该。 - Mark
@MarksaysReinstateMonica 最终肯定可以,但有些程序员刚刚起步! - callum

28

在这两个选择之间(感谢@Kooilnc提供的示例):

Number.prototype.abs = function(){
    return Math.abs(this);
};

var negative = -23, 
    positive = -negative>0 ? -negative : negative;

选择第二种方法(否定)。它不需要函数调用,CPU 可以在非常少的指令中完成。快速、简单、高效。


1
数学在JS引擎中得到了大量优化,我认为它不会比第二个选项慢。 - Fez Vrasta
我想知道编译器如何优化Math.abs()调用,有人愿意看一下并与我们分享吗? - Kelly S. French
2
确认 Math.abs 在 Chrome 上快了近 10 倍:https://jsperf.com/ternary-vs-math-abs - Derek 朕會功夫
1
@KellyS.French 我认为 Math.abs 只是简单地将第一位设置为0,没有任何条件语句,因为JS中的数字是以浮点数实现的。 - Derek 朕會功夫
@Derek朕会功夫 这样做不会影响负数的二进制补码吗? - Kelly S. French
@KellyS.French JS只有浮点数。浮点数不使用二进制补码。它们只是在最高位有一个标志位。 - Derek 朕會功夫

17
if (myvar < 0) {
  myvar = -myvar;
}
或者
myvar = Math.abs(myvar);

将-myvar设置为-900的值会使它变成负数-900还是正数900? - ian
一个负负得正。因此,-(-900)= 900。 - Matt Howell
1
是的,因为两个否定变成了肯定。不过我会使用Math.abs()函数。 - Tim Banks
2
那是数学,不是编程。 - jprete

2
这不是jQuery的实现,而是使用JavaScript中的Math库。
x = Math.abs(x);

6
太棒了!并不是每个解决方案都需要使用jQuery。它是一个很好的库,但被过度使用了。 - MikeHall

2
或者,如果你想避免函数调用(和分支),你可以使用以下代码:
x = (x ^ (x >> 31)) - (x >> 31);

这种方法可能有点“hackish”,不过在某种奇怪的方式下看起来还不错。但我仍然建议使用Math.abs(只是想展示另一种方法)。

顺便提一下,这种方法只适用于底层 JavaScript 引擎将整数存储为 32 位的情况,在我的机器上(32 位),Firefox 3.5 是这种情况(在 64 位机器上可能会不适用,我没有测试过...)


1
当然,这是另一种方法。但它不清楚你在做什么,比Math.abs难以阅读,如果这还不够,它在Firefox 3.6上也比Math.abs(x)慢。如果你必须复杂化事情,使用x < 0 ? -x : x(在其他测试的浏览器中最快)。你的代码在Opera 10.63中慢1%,在Chrome 6.0中慢12%,在IE8中慢20%。 - some

1

如果你不想使用 Math.Abs,你可以使用这个简单的 if 语句 :P

if (x < 0) {
    x = -x;
}

当然,您可以像这样将其制作为函数
function makePositive(number) {
    if (number < 0) {
        number = -number;
    }
}

makepositive(-3) => 3 makepositive (5) => 5

希望这可以帮到您!Math.abs 可能适用于您,但如果不行,这个小函数可以将负数转换为正数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接