回答:
var x = -100; ~x+1 === 100しかしvar x = 100; ~x+1 === -100。Math.abs1の補数をとるときは常にそれを正にし、単に符号を反転させます。
どうx *= -1ですか?私はそのシンプルさが好きです。
xが反転されます。場合はx = 23、その式に押し込まれ、xその後、等しくなります-23。エスカランテ氏の言葉では、「正の値と負の値は負の値に等しく、負の値と負の値は正の値に等しくなります。」...「どうすればこれらのKiiiiiiidsに到達できますか?!」
x=23、-23になります。質問が進むにつれて、「JSで負の数を正の数に変換する」が、上記は正の数でも負の数でも、任意の数を反転させます。
x常に肯定的ではありませんでした。お詫び@myusuf。
マイナス記号(-)は、正の数を負の数に、負の数を正の数に変換できます。x=-yは視覚的な砂糖ですx=(y*-1)。
var y = -100;
var x =- y;
誰も更新できない興味深いコードを書きたい場合は、これを試してください:
〜--x
~オペレーターは数値を32ビット整数に変換します。入力としてフロートがある場合、それはホースになります。
これは少し遅いことはわかっていますが、これに苦労している人は、次の関数を使用できます。
任意の数を正に
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(-1)を掛けることは、負の数を正の数に変換する最も速い方法です。しかし、私の間違いを正の数を負の数に変換しないように注意する必要があります!したがって、追加のチェックが必要です...
次に、Math.abs、Math.floor、parseIntが最も遅くなります。
https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1
このようなことを自分でやった。
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は機能します。
私はその解決策がかなり楽しいことを発見し、そこに投げ込まれたばかりであり、それを見ている投稿者がおそらくそれを無視していたので、それを拡張することに決めました。はい、それはフロートで動作しません。
私の希望は、この投稿が元の質問から離れていないことです。:/
それを行う別の方法を知っています。このテクニックはネガティブからポジティブまで機能します。
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);
関数型プログラミングの場合、Ramdaにはこのための優れた方法があります。同じ方法が、ポジティブからネガティブへ、そしてその逆へと進みます。
何ができるかに関係なく、常に数値を正にしたい場合。
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がいくつかのクレイジーなことをすることがあるので、はっきりとは言えません。
n*-nする必要がありますn*-1。ただし、型変換とメソッド呼び出しは最初の例の単純さに比べて非常に非効率であるため、この例は完全に削除します。JSの奇抜さでさえ、ここでは役に立たないでしょう