JavaScript中的正数到负数?


101

基本上是abs的反向。如果我有:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  slideNum = -slideNum
}
console.log(slideNum)

无论哪个控制台始终返回正数。我该如何解决?

如果我做:

if ($this.find('.pdxslide-activeSlide').index() < slideNum - 1) {
  _selector.animate({
    left: (-slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
} else {
  _selector.animate({
    left: (slideNum * sizes.images.width) + 'px'
  }, 750, 'InOutPDX')
}

它可以正常工作,但不是“ DRY”,只是愚蠢地将整个代码块用于-


4
我确定有一个jQuery插件。
2011年

Answers:


190
Math.abs(num) => Always positive
-Math.abs(num) => Always negative

您确实意识到,对于您的代码

if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum = -slideNum }
console.log(slideNum)

如果找到的索引为3并且slideNum为3,
则3 <3-1 => false,
因此slideNum 仍为正

在我看来,这更像是一个逻辑错误。



29

将正反转为负或将负反转为正的基本公式:

i - (i * 2)

32
这有什么错i * -1?另外,我不确定这是否能回答实际问题。
Andrew Barber

5
它的体系结构相关的,但是0 -我可能会更快
奔Taliadoros

@AndrewBarber i * -1在当前版本的chrome中似乎不起作用。尽管不确定为什么使用-Math.abs(1),希望有人可以对此进行扩展。
菲利普·罗林斯

@PhilipRollins i * -1将始终有效。我不知道您如何尝试,也许您有错字。但是...用什么i = -i代替i = i * -1(或 i *= -1)将正反转为负或将负反转为正呢?
迭戈·佐拉奇

@DiegoZoracKy我也这么认为,但不是针对我所运行的chrome版本,它在firefox中有效,因此不会出现错字。我现在在Linux上,但是您可以自由地测试关于chrome的理论。请记住chrome自动更新,因此任何错误修复都已应用,任何新的错误都将推向社区,这意味着这可能只持续了几天,现在已永久修复。
菲利普·罗林斯

9

要在JavaScript中获得数字的负数形式,您始终可以使用~按位运算符。

例如,如果您有a = 1000并且需要将其转换为负数,则可以执行以下操作:

a = ~a + 1;

这将导致a存在-1000


这比乘以负1快吗?
ryandawkins 2015年

我不确定说实话,您必须研究一下。
本杰明·威廉姆斯

@RyanDawkins这不会比乘以-1快。Java语言本身不像C语言那样具有布尔运算符。因此,要执行布尔操作,JS必须在后台进行类型之间的转换。
自旋锁

2
为什么不a = -a呢?
迭戈·佐拉奇

按位并不完全否定数字。~1000-1001,不是-1000
brentonstrine

7
var x = 100;
var negX = ( -x ); // => -100

1
请添加一些解释来编辑您的答案,避免仅提供代码答案
GGO

1
@GGO ...我不确定如何将其清除,但可以确定:通过在值前面添加减号,然后将其包装在括号中,将对值进行求值...结果是值。
tpayne84

6

您确定控件将进入主体if吗?就像if永远存在的条件一样吗?因为如果不这样做,则主体if将永远不会执行并slideNum保持正状态。我要冒昧地猜测这可能就是您所看到的。

如果我在Firebug中尝试以下操作,它似乎可以工作:

>>> i = 5; console.log(i); i = -i; console.log(i);
5
-5

slideNum *= -1应该也可以。应该Math.abs(slideNum) * -1


我刚刚做了if($this.find('.pdxslide-activeSlide').index() < slideNum-1){ slideNum *= -1 },即时通讯在该console.log中仍然返回正值?
奥斯卡·戈德森

@奥斯卡,Vivin在说什么$this.find('.pdxslide-activeSlide').index() < slideNum-1总是错的。
David Tang

4

如果您不想使用Math.Abs​​ * -1,则可以使用以下简单的if语句:P

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

当然,您可以使此功能像这样

function makeNegative(number) {
    if (number > 0) {
        number = -number;
    }
}

makeNegative(-3)=> -3 makeNegative(5)=> -5

希望这可以帮助!Math.abs可能会为您工作,但如果不是那么少的话


在回答问题之前,您还应该考虑询问问题的时间。这个问题将近5年了。因此,除非技术发生了变化,并且现在有了一个更好/更合适的答案,否则提供另一个答案通常不会增加太多价值。
伊戈尔(Igor)

1
我个人一直都在研究旧的堆栈溢出问题。当然这对专业人士不会有太大帮助,但也许是初学者可能会喜欢这个技巧!那就是说,最简单的方法实际上就是上面的-Math.Abs​​(-3)如上所述,Math.Abs​​将任何值变成正数。然后,负数前缀将其
设为

已投票。我个人很欣赏这个答案,并认为它很有价值。您可以向任何人学习。
jeremysawesome

3
var i = 10;
i = i / -1;

结果: -10

var i = -10;
i = i / -1;

结果: 10

如果用负1除,它将始终以任何一种方式翻转您的数字。



2

JavaScript为此有专门的运算符:一元否定

TL; DR:这是减号!

要取消数字,只需-以最直观的方式为其加上前缀。无需编写函数,使用Math.abs()乘法-1或使用按位运算符。

一元求反适用于数字文字:

let a = 10;  // a is `10`
let b = -10; // b is `-10`

它也适用于变量:

let x = 50;
x = -x;      // x is now `-50`

let y = -6;
y = -y;      // y is now `6`

如果使用分组运算符,您甚至可以多次使用它(也称为括号:

l = 10;       // l is `10`
m = -10;      // m is `-10`
n = -(10);    // n is `-10`
o = -(-(10)); // o is `10`
p = -(-10);   // p is `10` (double negative makes a positive)

上面所有这些同样适用于变量。



1

它将负数组转换为正数组,反之亦然

function negateOrPositive(arr) {
    arr.map(res => -res)
};

0

在香草JavaScript中

if(number > 0)
  return -1*number;

上面是正数,你打算转换

此代码只需将-1乘以即可将正数转换为负数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.