Javascript มี -0 (Negative Zero) ด้วยนะ

เนื่องจากไม่เชี่ยวชาญ Javascript ถึงจะรู้ว่ามันไม่เหมือนภาษาทั่วๆไปอยู่หลายอย่าง แต่สิ่งที่เจอมาล่าสุดมันแปลกมาก คือ สั่งให้แสดงค่าตัวเลขออกมาแล้วเจอว่ามันแสดงผลเป็น -0 เข้าใจถูกแล้วครับ มันมีเครื่องหมายลบหน้าเลขศูนย์ด้วย ซึ่งมันอาจจะแปลกๆเวลาให้คนที่มาดู ว่ามันต่างจาก 0 ธรรมดาอย่างไร

พอจะรู้อยู่บ้างว่าตัวแปรชนิด Number ใน Javascript นั้นเก็บได้ทั้งจำนวนเต็มและจำนวนแบบมีทศนิยม เหตุการณ์ที่เกิดขึ้นนี้ เกิดจากการใช้ฟังก์ชัน Math.round(ตัวเลขติดลบที่จริงๆแล้วน่าจะเป็นค่าศูนย์) เช่น Math.round(-0.0000123) เอาไปลองใน Chrome Console ดูได้เลย

พอจะต้องแก้ให้ตรวจว่าถ้าเจอ -0 ก็ต้องแสดงผลเป็น 0 จึงได้เจอหนังสือเล่มหนึ่งสรุปไว้ให้แล้วว่านี่คือกลไกใน Javascript จริงๆ!!!

เหตุผลคือ ระบบของ Number จะเก็บค่าของตัวเลขกับเครื่องหมายแยกกัน จึงเป็นที่มาว่า Math.round ปัดค่าตัวเลขเรียบร้อย แต่ไม่ได้ยุ่งกับเครื่องหมาย

ในกรณีเพื่อแสดงผลจริงๆแล้ว Javascript จะปรับการแสดงผลให้ถูกต้องเมื่อ Number กลายเป็น String ดังนั้น Math.round(-0.0000123).toString() จะได้ค่า “0” (0 แบบ String) แต่ถ้ามีความจำเป็นต้องตรวจสอบว่าค่าที่ได้นั้นเป็น -0 (Negative Zero) หรือไม่ ให้ใช้ฟังก์ชันนี้ช่วยได้

function isNegativeZero(x) { return x === 0 && (1/x < 0); }

ซึ่งค่า x จะเป็น -0 กรณีเดียวเท่านั้น คือ ค่าต้องเท่ากับ 0 และเมื่อใช้ division by zero แล้วยังน้อยกว่า 0

เหตุผลคือ

  • 0 === -0 และ
  • 1/0 = Infinity แต่ 1/-0 = -Infinity (ยังคงเครื่องหมายไว้)

ที่มา:

สแลช (Slash)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s