ตรวจสอบว่าค่าอยู่ในช่วงของตัวเลขหรือไม่


115

ฉันต้องการตรวจสอบว่าค่าอยู่ในช่วงที่ยอมรับหรือไม่ ถ้าใช่เพื่อทำอะไรบางอย่าง มิฉะนั้นอย่างอื่น

ช่วงคือ0.001-0.009. ฉันรู้วิธีใช้หลายตัวifเพื่อตรวจสอบสิ่งนี้ แต่ฉันต้องการทราบว่ามีวิธีใดในการตรวจสอบในifคำสั่งเดียวหรือไม่


14
&&โอเปอเรเตอร์? ...
Šime Vidas

คำตอบ:


224

คุณกำลังถามคำถามเกี่ยวกับการเปรียบเทียบตัวเลขดังนั้นนิพจน์ทั่วไปจึงไม่เกี่ยวข้องกับปัญหานี้เลย คุณไม่จำเป็นต้องมีifคำสั่ง " หลายรายการ" ในการทำเช่น:

if (x >= 0.001 && x <= 0.009) {
  // something
}

คุณสามารถเขียนฟังก์ชัน "between ()" ให้ตัวเอง:

function between(x, min, max) {
  return x >= min && x <= max;
}
// ...
if (between(x, 0.001, 0.009)) {
  // something
}

1
การเข้ารหัสของคุณดี แต่ไม่ตรงกับคำถามนั่นคือทั้งหมด ไม่มีความผิด ฉันมักจะตัดสินวิธีแก้ปัญหาโดยตอบคำถามได้ดีเพียงใด นั่นเป็นเพราะโดยทั่วไปฉันถือว่าคนอื่นรู้ว่าพวกเขากำลังขออะไร เครื่องหมายถูกแสดงว่านี่ไม่ใช่กรณีของผู้ถามรายนี้
Leif

7
ฉันซาบซึ้งในสิ่งที่คุณพูด แต่ฉันขอแนะนำว่าคุณอาจต้องการพิจารณาหลักฐานใหม่ที่คนทั่วไปที่นี่ "รู้ว่าพวกเขากำลังขออะไร" นั่นอาจเป็นความจริงในความหมายที่แคบแต่บ่อยครั้งคำถามเหล่านี้สะท้อนให้เห็นถึงการตัดสินใจในการออกแบบที่ไม่ดีซึ่งควรกลับมาทบทวน ฉันตอบคำถามเกี่ยวกับการเขียนโปรแกรมมาประมาณ 30 ปีแล้วดังนั้นฉันจึงเห็นมันเกิดขึ้นหลายครั้ง แน่นอนว่าฉันชอบคำถามที่ดีกว่าซึ่งมีการอธิบายเป้าหมายโดยรวมอย่างชัดเจน ที่นี่เราไม่รู้เหตุผลของคำถามดังนั้นเราจึงไม่มีบริบท
Pointy

6
ฉันชอบใช้ไวยากรณ์แบบนี้: if (0.001 <= x && x <= 0.009) {... } ดูเหมือนจะชัดเจนกว่าสำหรับฉันเล็กน้อย :)
Omri

51

นี่คือตัวเลือกที่มีเพียงการเปรียบเทียบเดียว

// return true if in range, otherwise false
function inRange(x, min, max) {
    return ((x-min)*(x-max) <= 0);
}

console.log(inRange(5, 1, 10));     // true
console.log(inRange(-5, 1, 10));    // false
console.log(inRange(20, 1, 10));    // false

นี่เป็นสิ่งที่ดีไม่สำคัญว่า min จะต่ำกว่าหรือ max ต่ำกว่ามันก็ยังใช้ได้ ในความเป็นจริงมันอาจจะดีกว่าถ้าโทรหา min, max เช่น start, end ขอบคุณมากทั้งสองทาง!
James Harrington

1
จะไม่มีใครโปรดคิดถึงความซับซ้อนของเวลา!? ฉันจะใช้วิธีแก้ปัญหาที่ยอมรับเพราะการเปรียบเทียบสองรายการที่Θ (2) ดีกว่าการเปรียบเทียบหนึ่งครั้งและการคำนวณเลขคณิตสามครั้งที่ O (4)
Matt McCarthy

ฉันไม่เคยอ้างว่ามันเป็นสิ่งที่คุณคิดว่าตัวเองเป็น มันเป็นตัวเลือกที่ทำงานได้ แต่อย่างไรก็ตาม
Alexander

19

หากคุณต้องใช้ regexp (และจริงๆแล้วคุณไม่ควร!) สิ่งนี้จะใช้ได้:

/^0\.00([1-8]\d*|90*)$/

ควรทำงานเช่น

  • ^ ไม่มีอะไรมาก่อน
  • ตามด้วย0.00(nb: เครื่องหมายแบ็กสแลช Escape สำหรับ.อักขระ)
  • ตามด้วย 1 ถึง 8 และตัวเลขเพิ่มเติมใด ๆ
  • หรือ 9 ตามด้วยจำนวนศูนย์
  • $: ตามด้วยอะไรอื่น

8

หากคุณใช้งานอยู่แล้วlodashคุณสามารถใช้inRange()ฟังก์ชัน: https://lodash.com/docs/4.17.15#inRange

_.inRange(3, 2, 4);
// => true

_.inRange(4, 8);
// => true

_.inRange(4, 2);
// => false

_.inRange(2, 2);
// => false

_.inRange(1.2, 2);
// => true

_.inRange(5.2, 4);
// => false

_.inRange(-3, -2, -6);
// => true

3

ฉันชอบbetweenฟังก์ชั่นของ Pointy ดังนั้นฉันจึงเขียนสิ่งที่คล้ายกันซึ่งใช้ได้ดีกับสถานการณ์ของฉัน

/**
 * Checks if an integer is within ±x another integer.
 * @param {int} op - The integer in question
 * @param {int} target - The integer to compare to
 * @param {int} range - the range ±
 */
function nearInt(op, target, range) {
    return op < target + range && op > target - range;
}

ดังนั้นหากคุณต้องการดูว่าxอยู่ในช่วง± 10 ของy:

var x = 100;
var y = 115;
nearInt(x,y,10) = false

ฉันใช้มันเพื่อตรวจจับการกดบนมือถือแบบยาว:

//make sure they haven't moved too much during long press.
if (!nearInt(Last.x,Start.x,5) || !nearInt(Last.y, Start.y,5)) clearTimeout(t);

1

หากคุณต้องการให้รหัสของคุณเลือกช่วงของตัวเลขที่เฉพาะเจาะจงให้แน่ใจว่าได้ใช้&&โอเปอเรเตอร์แทน||.

if (x >= 4 && x <= 9) {
  // do something
} else {
  // do something else
}

// be sure not to do this

if (x >= 4 || x <= 9) {
  // do something
} else {
  // do something else
}


0

คุณต้องต้องการกำหนดขอบเขตล่างและบนก่อนที่จะเขียนเงื่อนไข

function between(value,first,last) {

 let lower = Math.min(first,last) , upper = Math.max(first,last);
 return value >= lower &&  value <= upper ;

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.