2012-11-19 5 views
8

可能性の重複:いくつかの数の変数を考慮
Number.sign() in javascriptJavascriptで数字の記号を取得する最も簡単な方法は何ですか?

、それが署名していますかを決定するための最も簡単な方法は何ですか?

私はこのようなコードで終わる続ける:

var direction = (vector[0] > 0) ? 1: (vector[0] < 0) ? -1: 0; 

正および0の場合、それが0であれば、私が望むすべては数が負の場合、-1である1ときには、エレガント未満と思われます

「もっとも簡単」とは、エレガントで少ない入力を意味します。

また、絶対に値を増やす方法があるかもしれません。数字が負の場合と同様に、それから1を減算し、1を加算することが正の場合。 Math.abs()は絶対値を提供しますが、Math.abs()を実行すると符号付き数値に変換する方法はありません。

+0

にデフォルト設定されます。https://developer.mozilla.org Math.sign(-0)=== Math.sign(+0)/ en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign しかし実装のために、 ' – johncip

答えて

14

を?

sign = function(n) { return n == 0 ? 0 : n/Math.abs(n); } 
+2

私は不当なdownvoteをロールバックするためにあなたのポストに化粧の編集をしました。 –

+0

このアプローチは、ベンチマークでの比較ベースのアプローチよりもずっと遅いですが、部門は遅くなる必要があります。 –

2

あなたは絶対で数を分割することができますし、看板得るだろう:それを行うための関数を定義について

var sign = number && number/Math.abs(number); 
+2

数字が0の場合はどうですか? –

+0

あなたは@JamieWongです。私のコードを更新しました –

+0

うわー、&&は0を扱っています。 – BishopZ

4

方法:あなたはこれを行うことができます

var sign = number && number/Math.abs(number); 
+1

'return n ||と同じではないでしょうか? n/Math.abs(n) '? – elclanrs

+0

あなたはそれをMathにモンキーパッチして、さらに数学的にするために 'sgn'または' signum'と呼ぶことができます。 –

+0

@elcanrsいいえ、それはあなたが望むものの反対です - n *がゼロのときだけ分割を行います。 –

1

あなたが短い方法をしたい、とあなたはそれが数だ知っている、とあなたが署名した32ビットの範囲に限定されるものでは気にしない場合は、あなたがこれを行うことができます:

n ? -(n >>> 31) || 1 : 0; 

  • n場合次いで、0
  • n >>> 311であれば、それはそうnegativ、署名された0であり、nとなり-1
  • にegated n >>> 310であれば、それは、それほどポジティブ署名されていない、あなたは `Math.signを()`を使用することができますES6で1
+0

注意これは、 'n'がLongではなくInt32であると仮定し、負の' n < - (2 ** 31 + 1) 'で失敗します。 –

+1

@PaulS:うん、私の答えの範囲の制限に注意してください。 :) –

+0

私はこれを正しいものとしてマークしていませんでした。なぜなら、それはほとんどの人にとって直感的な直感ではないからです。私はこのアプローチが本当に好きで、投稿してくれてありがとう! – BishopZ

関連する問題