【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)
この記事が気に入ったらサポートをしてみませんか?