JavaScriptで負の数を正の数に変換する


308

JavaScriptに数値を正の値に変換する数学関数はありますか?

回答:


704

あなたはこれを使うことができます...

Math.abs(x)

Math​.abs()| MDN


1
〜x + 1を検討することもできます。それはかなり速いですが、それが何をしているかについては明確ではありません。違いを示すためにこれをホイップしました:jsperf.com/absolute-int
omgaz

22
@omgaz彼らは同じではありません... var x = -100; ~x+1 === 100しかしvar x = 100; ~x+1 === -100Math.abs1の補数をとるときは常にそれを正にし、単に符号を反転させます。
jduncanator 2014

-xを検討することもできます。それはかなり速いです!
アマラ2018年

93

どうx *= -1ですか?私はそのシンプルさが好きです。


17
これは簡単ですが、数値は常に負になると仮定しています。ユースケースがそのような場合、それは素晴らしいです。それ以外の場合は、注意が必要です。
myusuf 2015

4
@myusufに同意しません。ある任意の数xが反転されます。場合はx = 23、その式に押し込まれ、xその後、等しくなります-23。エスカランテ氏の言葉では、「正の値と負の値は負の値に等しく、負の値と負の値は正の値に等しくなります。」...「どうすればこれらのKiiiiiiidsに到達できますか?!」
ExcellentSP

2
まさに昨日@Shane。の場合はx=23、-23になります。質問が進むにつれて、「JSで負の数を正の数に変換する」が、上記は正の数でも負の数でも、任意の数を反転させます。
myusuf

2
わかった。あなたのコメントの私の解釈は、数を反転させるという文脈であり、x常に肯定的ではありませんでした。お詫び@myusuf。
ExcellentSP

1
このソリューションはFloat数には適用されず、小数部分しか取得できないことを思い出してください
Oscar Luza

46

Math.abs(x)または、変換前に値が負であることが確実な場合は、通常のマイナス記号を追加しますx = -x




12
var posNum = (num < 0) ? num * -1 : num; // if num is negative multiple by negative one ... 

このソリューションは理解しやすいと思います。


8

誰も更新できない興味深いコードを書きたい場合は、これを試してください:

〜--x


1
ただし、これは浮動小数点では機能しません... xの値も変化します。
Alexis Wilke、2014年

xを変更できないと思います:〜
Kyle

1
カイル、~オペレーターは数値を32ビット整数に変換します。入力としてフロートがある場合、それはホースになります。
Alexis Wilke 2014年

7

これは少し遅いことはわかっていますが、これに苦労している人は、次の関数を使用できます。

  • 任意の数を正に

    let x =  54;
    let y = -54;
    let resultx =  Math.abs(x); //  54
    let resulty =  Math.abs(y); //  54
  • 負の数を回します

    let x =  54;
    let y = -54;
    let resultx = -Math.abs(x); // -54
    let resulty = -Math.abs(y); // -54
  • 任意の数を反転

    let x =  54;
    let y = -54;
    let resultx = -(x);         // -54
    let resulty = -(y);         //  54

6

負から正へ

var X = -10 ;
var number = Math.abs(X);     //result 10

ポジティブからネガティブへ

var X = 10 ;
var number = (X)*(-1);       //result -10

見せたいことはわかりますが、言い方がわかりにくいです。多分あなたは述べるべきです:肯定的に:absを使用して、否定的に:abs(x)* -1。この方法では、以前のX記号が何であるかを暗示することはありません。
Dionys

5

(-1)を掛けることは、負の数を正の数に変換する最も速い方法です。しかし、私の間違いを正の数を負の数に変換しないように注意する必要があります!したがって、追加のチェックが必要です...

次に、Math.abs、Math.floor、parseIntが最も遅くなります。

ここに画像の説明を入力してください

https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1


1
私たちの中には、そのような場合に基本的な数学がいかに役立つかを忘れています。そのような単純さを思い出させてくれてありがとう。
Alexander Dixon

2

このようなことを自分でやった。

num<0?num*=-1:'';

数値が負かどうかをチェックし、負の場合は-1を掛けます。これは値を返します。キャプチャした場合は、その値を返します。それを何かに割り当てたい場合は、おそらく次のようにする必要があります。

var out = num<0?num*=-1:num; //I think someone already mentioned this variant.

しかし、それは本当にあなたの目標が何であるかに依存します。私にとってそれは単純でした、否定的であればそれを肯定的にし、そうでなければ何もしません。したがって、コード内の ''です。この場合、私が望んでいた3次演算子を使用しましたが、次のようにすることもできます。

if(num<0)num*=-1;

私はここでビットごとのソリューションを見て、それについてもコメントしたいと思いました。

~--num; //Drawback for this is that num original value will be reduced by 1

このsoultionは私の意見では非常に豪華です。次のように書き直すことができます。

~(num = num-1);

簡単に言うと、負の数を取り、1を取り除いてから、ビットごとに反転します。ビット単位で反転した場合、通常は値1が小さすぎます。これを行うこともできます:

~num+1; //Wont change the actual num value, merely returns the new value

同じことを行いますが、最初に反転してから正の数に1を加えます。あなたはこれを行うことができますが:

~num++; //Wont display the right value.

これはprecedenceの原因にはなりません。などのpostfix演算子はnum++〜の前に評価され、理由プレフィックスが++numビット単位のNOT(〜)と同じ優先順位であっても機能しないため、右から左に評価されます。私はそれらを交換しようとしましたが、プレフィックスはビット単位のNOTに比べて少し気難しいようです。「+」の方が優先順位が高く、後で評価されるため、+ 1は機能します。

私はその解決策がかなり楽しいことを発見し、そこに投げ込まれたばかりであり、それを見ている投稿者がおそらくそれを無視していたので、それを拡張することに決めました。はい、それはフロートで動作しません。

私の希望は、この投稿が元の質問から離れていないことです。:/



0

数値を論理的に負に変換し、負に1を加える演算子を使用できます。

var x = 3;
x = (~x + 1);
console.log(x)
// result = -3


0

それを行う別の方法を知っています。このテクニックはネガティブからポジティブまで機能します。

var x = -24;
var result = x * -1;

逆に:

var x = 58;
var result = x * -1;

ライブコード:

// NEGATIVE TO POSITIVE: ******************************************
var x = -24;
var result = x * -1;
console.log(result);

// VICE VERSA: ****************************************************
var x = 58;
var result = x * -1;
console.log(result);

// FLOATING POINTS: ***********************************************
var x = 42.8;
var result = x * -1;
console.log(result);

// FLOATING POINTS VICE VERSA: ************************************
var x = -76.8;
var result = x * -1;
console.log(result);


それは質問に答えません。daveは、値を負から正に正から正に変更する関数を要求します。
RaphaMex

彼の質問は、「JavaScriptに数値を正の値に変換する数学関数はありますか?」と述べています。彼はポジティブからポジティブへの言及はしていません。彼は否定的なものから肯定的なものに言及するだけです。なぜあなたはポジティブをポジティブに変えたいのですか?値は同じになります。
Tarryk Ttmm

質問の下のコメントで説明を求めることができます。とにかく、正しいものである受け入れられた答えがあります。もう一度読むと、...を正に変換する組み込み関数があることがわかります。
RaphaMex 2018

0

関数型プログラミングの場合、Ramdaにはこのための優れた方法があります。同じ方法が、ポジティブからネガティブへ、そしてその逆へと進みます。

https://ramdajs.com/docs/#negate


0

何ができるかに関係なく、常に数値を正にしたい場合。

function toPositive(n){
    if(n < 0){
        n = n * -1;
    }
    return n;
}
var a = toPositive(2);  // 2
var b = toPositive(-2); // 2

これを試すこともできますが、お勧めしません。

function makePositive(n){
    return Number((n*-n).toString().replace('-','')); 
}
var a = makePositive(2);  // 2
var b = makePositive(-2); // 2

この問題は、数値を負の値に変更してから文字列に変換し、文字列から-を削除してから、intに変換し直す可能性があることです。他の関数を使用するよりも処理に時間がかかると思います。

私はこれをphpでテストしましたが、最初の関数はより高速ですが、JSがいくつかのクレイジーなことをすることがあるので、はっきりとは言えません。


2番目の例は、入力数値の累乗を出力します。n*-nする必要がありますn*-1。ただし、型変換とメソッド呼び出しは最初の例の単純さに比べて非常に非効率であるため、この例は完全に削除します。JSの奇抜さでさえ、ここでは役に立たないでしょう
Gust van de Wal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.