1. ホーム
  2. javascript

[解決済み] [解答】+0と-0は同じですか?

2022-04-19 10:56:06

質問

を読み解く ECMAScript 5.1仕様書 , +0-0 は区別されます。

では、なぜ +0 === -0 と評価されます。 true ?

解決方法は?

JavaScriptは IEEE754規格 を使用して数字を表現します。から ウィキペディア :

符号付ゼロ とは、符号を伴うゼロのことです。通常の算数では、-0 = +0 = 0ですが、計算機では、2つのゼロの存在を許す数表現があり、その場合、しばしば -0 (負のゼロ) +0(正のゼロ) . これは整数の符号付き数値表現の一部と、ほとんどの浮動小数点数表現で発生します。0 は通常 +0 として符号化されますが、+0 または -0 として表現することもできます。

浮動小数点演算のIEEE754規格(現在、浮動小数点数をサポートするほとんどのコンピュータとプログラミング言語で使用されている)では、+0と-0の両方が必要です。0は、1/-0=-∞、1/+0=+∞という拡張実数線の変形として考えることができ、0による除算は±0/±0と±∞/±∞に対してのみ不定となります。

この記事には、さまざまな表現についての詳細が書かれています。

これが、技術的に両方のゼロを区別しなければならない理由なんですね。

<ブロッククオート

しかし +0 === -0 は真と評価されます。なぜでしょう?

この動作は、明示的に セクション11.9.6 は、その 厳密な等価比較アルゴリズム (強調は一部筆者)。

比較対象 x === y ここで xy が値であれば または 虚偽 . このような比較は、以下のように行われる。

(...)

  • Type(x)がNumberの場合、以下のようになります。

    1. xがNaNの場合、falseを返す。
    2. y が NaN の場合、false を返す。
    3. xがyと同じNumber値であれば、trueを返す。
    4. xが+0、yが-0のとき、trueを返す。
    5. x が -0 で y が +0 ならば真を返す。
    6. false を返します。

(...)

(以下、同じ) +0 == -0 btw.)

を扱うのが論理的だと思われます。 +0-0 を等しくしています。そうでなければ、コードの中でこのことを考慮しなければならず、個人的にはそんなことはしたくありません;)


ES2015 では、新しい比較方法が導入されました。 Object.is . Object.is を明示的に区別しています。 -0+0 :

Object.is(-0, +0); // false