見出し画像

【JavaScript】マイナスゼロの罠

ある日、JSerの砂糖君は(架空の)プログラミングコンテストに参加することにしました。開始時間になった砂糖君は、画面とにらめっこを始めます。

問題文

A と B の積を出力してください。

制約

・-1 ≤ A, B ≤ 1
・A, B は整数

砂糖君の回答

「うおおおおおおお😤」

const func = (a, b) => a * b

提出結果

問題文を読み終わるなり、猛スピードでコードを打ち込んだ砂糖君。その勢いのまま自信満々で提出ボタンを押しました。

結果、不正解。

「AとBをかけるだけなのに?」
読み間違うほうが難しいほどの簡潔な問題を前に、砂糖君は混乱してしまいました。

デバッグ

幸いにも制約の関係で、入力の全ケースを確認することは難しくありません。砂糖君は全ケースを出力するコードを書き始めます。

for (let i = -1; i <= 1; i++) {
  for (let j = -1; j <= 1; j++) {
    console.log(i, j, func(i, j))
  }
}

実行してみたところ、以下の結果が出力されました。

-1 -1 1
-1 0 -0
-1 1 -1
0 -1 -0
0 0 0
0 1 0
1 -1 -1
1 0 0
1 1 1

ここで砂糖君はあることに気づきます。

「-0ってなんだ?🤔」

解説

文字列として出力された「-0」と想定解の(文字列の)「0」を比較したのが不正解の理由です。

「0 は 0 と -0 の二種類の表現を持ち、実用上は影響がほとんどない」とのことですが、console.log では -0 として出力されます。マイナスの値に 0 をかけると -0 になるので割と遭遇しやすい…😵

競技プログラミングなどで出力結果が -0 になりそうな場合、またマイナスを消したい場合は 0 を足すとマイナスが消えるようです。

console.log(-0 + 0)

この記事が気に入ったらサポートをしてみませんか?