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」ではなく、コードブロック全体をJUSTだけにするのは愚か-です。


4
そのためのjQueryプラグインがあると確信しています。
Jakub Hampl

回答:


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-私はより速いかもしれない
Ben Taliadoros 2014年

@AndrewBarber i * -1は、現在のバージョンのChrome では機能しないようです。-Math.abs(1)を使用してください。なぜこれが機能するのかは不明ですが、誰かが理由を拡張できれば幸いです。
フィリップロリンズ

@PhilipRollins i * -1は常に機能します。どうやって試したかわかりませんが、タイプミスがあったのかもしれません。しかし... ポジティブからネガティブに、またはネガティブからポジティブにリバースするi = -i代わりにi = i * -1(または i *= -1)の何が問題になっていますか?
Diego ZoracKy 16

@DiegoZoracKy私もそう考えましたが、実行しているChromeのバージョンではそうではなく、Firefoxで動作したため、タイプミスは問題外です。私は現在Linuxを使用していますが、理論をChromeで自由にテストできます。すべてのバグ修正がすでに適用され、新しいバグがコミュニティにプッシュされるように、Chromeの自動更新を覚えておいてください。これは、数日しか続かなかったバグであり、現在は完全に修正されている可能性があることを意味します。
フィリップロリンズ

9

JavaScriptで負の数の数値を取得するには、常に~ビット演算子を使用できます。

たとえば、あなたが持っていてa = 1000、それをネガに変換する必要がある場合、次のようにすることができます:

a = ~a + 1;

どちらにつながるaという-1000


これは、負の1を掛けるよりも速いですか?
ryandawkins 2015年

正直なところ、あなたが調べなければならないことは確かです。
ベンジャミンウィリアムズ

@RyanDawkinsこれは、-1を掛けるよりも速くはありません。Javascriptには、Cのようにネイティブにブール演算子はありません。そのため、ブール演算を実行するには、JSは内部で型間を変換する必要があります。
スピンロック2016年

2
なんでa = -a
Diego ZoracKy 16

ビットワイズは数値を正確に否定しません。~1000-1001、ではありません-1000
ブレント

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でまだ肯定的に戻りますか?
オスカー

@オスカー、ビビンが言っていること$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年前のものです。したがって、テクノロジーが変化し、より良い/より適切な答えが出ない限り、通常、別の答えを提供することによる付加価値はあまりありません。
イゴール

1
私はいつも個人的に古いスタックオーバーフローの質問を調べています。確かにこれはプロにとってはあまり役に立ちませんが、おそらく初心者はヒントに感謝するかもしれません!とはいえ、最も簡単な方法は実際には上記と同じです。-Math.Abs​​(-3)上記のように、Math.Abs​​は任意の値を正にします。次に、負の接頭辞はそれを負にします
Ash Pettit

賛成。個人的に私はこの回答に感謝し、それが貴重であると思いました。誰からでも学ぶことができます。
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を乗算するだけで、正の数だけを負の数に変換します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.