ประเภทจำนวนเต็ม (จำนวนเต็ม) มักจะทำให้เกิดปัญหาแปลก ๆ ในจาวาสคริปต์ ในข้อกำหนด ECMASCRIPT พวกเขามีอยู่ในแนวคิดเท่านั้น:
ตัวเลขทั้งหมดเป็นหมายเลขจุดลอยตัวและจำนวนเต็มไม่มีชุดตัวเลขที่ไม่มีทศนิยม
ในบล็อกนี้ฉันจะอธิบายวิธีการตรวจสอบว่าค่าเป็นจำนวนเต็มหรือไม่
ecmascript 5
มีหลายวิธีที่คุณสามารถใช้ใน ES5 บางครั้งคุณอาจต้องการใช้วิธีการของคุณเอง: ฟังก์ชั่นของ isinteger (x) ซึ่งส่งคืนจริงถ้ามันเป็นจำนวนเต็มมิฉะนั้นจะส่งคืนเท็จ
ลองดูตัวอย่าง
ผ่านการตรวจสอบที่เหลือ
คุณสามารถใช้การดำเนินการที่เหลือ (%) และคำนวณส่วนที่เหลือโดย 1 เพื่อดูว่าส่วนที่เหลือคือ 0
ฟังก์ชั่น isinteger (x) {return x % 1 === 0;}ฉันชอบวิธีนี้เพราะมันง่ายและมีประสิทธิภาพมาก
> Isinteger (17) True> Isinteger (17.13) FALSE
คุณต้องระมัดระวังเมื่อปฏิบัติการที่เหลืออยู่เนื่องจากผลลัพธ์ขึ้นอยู่กับสัญญาณของหมายเลขแรก หากเป็นบวกผลลัพธ์จะเป็นบวก มิฉะนั้นจะเป็นลบ
> 3.5 % 10.5> -3.5 % 1-0.5
จากนั้นเราสามารถตรวจสอบ 0 ซึ่งไม่ใช่ปัญหาจริง แต่ปัญหาคือ: วิธีนี้จะส่งคืนจริงสำหรับไม่ใช่ตัวเลขเพราะ % จะแปลงเป็นตัวเลข:
> isinteger ('') true> isinteger ('33') true> isinteger (เท็จ) จริง> isinteger (จริง) จริงสามารถแก้ไขได้โดยการตรวจสอบประเภทง่าย ๆ :
ฟังก์ชั่น isinteger (x) {return (typeof x === 'number') && (x % 1 === 0);}โดย math.round () หากตัวเลขถูกปัดเศษและยังคงมีค่าเท่ากับก่อนหน้านี้จะเป็นจำนวนเต็ม ใน JavaScript คุณสามารถตรวจสอบผ่าน Math.Round ():
ฟังก์ชั่น isinteger (x) {return math.round (x) === x;}วิธีนี้ยังดี
> Isinteger (17) True> Isinteger (17.13) FALSE
นอกจากนี้ยังสามารถตัดสินที่ไม่ใช่ตัวเลขได้เนื่องจาก math.round () จะส่งคืนตัวเลขเสมอและ === ส่งคืนจริงเฉพาะในกรณีที่ประเภทเดียวกัน
> isinteger ('') เท็จหากคุณต้องการทำให้รหัสชัดเจนขึ้นคุณสามารถเพิ่มการตรวจสอบประเภท (ซึ่งเป็นสิ่งที่เราทำในเวอร์ชันก่อนหน้า) นอกจากนี้ Math.floor () และ Math.Ceil () สามารถทำงานได้เช่น Math.Round () การตรวจสอบตัวดำเนินการบิตผ่านการดำเนินการบิตให้วิธีการอื่นของ "การปัดเศษ":
ฟังก์ชั่น isinteger (x) {return (x | 0) === x;}โซลูชันนี้ (เช่นการดำเนินการบิตอื่น ๆ ) มีข้อเสียเปรียบหนึ่งข้อ: ไม่สามารถจัดการกับตัวเลขที่เกิน 32 บิต
> Isinteger (Math.pow (2, 32)) FALSE
การตรวจสอบ ParseInt () ผ่าน ParseInt () ยังมีวิธีการที่คล้ายกันกับ Math.round () เพื่อแปลงตัวเลขเป็นจำนวนเต็ม มาดูกันว่าทำไมวิธีนี้จึงดี
ฟังก์ชั่น isinteger (x) {return parseint (x, 10) === x;}เช่นเดียวกับการแก้ปัญหา Math.Round () มันสามารถจัดการกรณีที่ไม่ใช่ตัวเลขได้ แต่ก็ไม่สามารถจัดการหมายเลขจำนวนเต็มทั้งหมดได้อย่างถูกต้อง:
> Isinteger (10000000000000000000000000) FALSE
ทำไม ParseInt () บังคับให้พารามิเตอร์แรกถูกแยกวิเคราะห์เป็นสตริงก่อนที่จะแยกวิเคราะห์จำนวนเต็ม ดังนั้นการใช้วิธีนี้เพื่อแปลงตัวเลขเป็นจำนวนเต็มจึงไม่ใช่ทางเลือกที่ดี
> ParseInt (100000000000000000000000, 10) 1> สตริง (1000000000000000000000000) '1E+21'
เช่นเดียวกับด้านบน ParseInt () หยุดการประมวลผลที่ 1 เมื่อแยกวิเคราะห์ '1E+21' ดังนั้นจึงส่งคืน 1. ECMASCRIPT 6 สำหรับ Math.Round () การเพิ่มการเพิ่ม ES6 ให้วิธีอื่นเพื่อแปลงตัวเลขเป็นจำนวนเต็ม: Math.trunc () ฟังก์ชั่นนี้จะลบส่วนเศษส่วนของจำนวน
> math.trunc (4.1) 4> math.trunc (4.9) 4> math.trunc (-4.1) -4> math.trunc (-4.9) -4
นอกจากนี้ ECMAScript6 ไม่จำเป็นต้องจัดการกับงานเล็ก ๆ น้อย ๆ ที่ตรวจสอบจำนวนเต็มเนื่องจากมันมาพร้อมกับหมายเลขฟังก์ชั่นในตัว Isinteger ()