Bir değerin bir sayı aralığı içinde olup olmadığını kontrol edin


111

Bir değerin kabul edilen aralıkta olup olmadığını kontrol etmek istiyorum. Evet ise, bir şeyler yapmak; aksi takdirde başka bir şey.

Aralık 0.001-0.009. Bunu ifkontrol etmek için çoklu kullanmayı biliyorum , ancak bunu tek bir ififadeyle kontrol etmenin herhangi bir yolu olup olmadığını bilmek istiyorum .


14
&&Şebeke? ...
Šime Vidas

Yanıtlar:


219

Sayısal karşılaştırmalar hakkında bir soru soruyorsunuz, bu nedenle normal ifadelerin sorunla hiçbir ilgisi yok. Bunu yapmak için "birden çok if" ifadeye de ihtiyacınız yoktur:

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

Kendinize bir "between ()" işlevi yazabilirsiniz:

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

1
Kodlamanız iyi ama soruya uymuyor, hepsi bu. Alınma. Her zaman bir çözümü soruyu ne kadar iyi yanıtladığına göre değerlendiririm. Çünkü insanların ne istediklerini bildiklerini varsayıyorum. Onay işareti bana bu soru soran kişinin durumunun böyle olmadığını gösteriyor.
Leif

7
Söylediklerinizi takdir ediyorum, ancak buradaki insanların genel olarak "ne istediklerini bildikleri" önermesini yeniden gözden geçirmek isteyebileceğinizi öneririm. Bu çok dar anlamda doğru olabilir , ancak çoğu zaman bu sorular tekrar gözden geçirilmesi gereken bazı kötü tasarım kararlarını yansıtır. Yaklaşık 30 yıldır programlama sorularını yanıtlıyorum, bu yüzden bunun birçok kez olduğunu gördüm. Elbette daha iyi soruları tercih ederim, burada genel amaç açıkça açıklanır. Burada sorunun nedeni hakkında hiçbir fikrimiz yok , bu yüzden bağlamımız yok.
Pointy

6
Sözdizimini şu şekilde kullanmayı seviyorum: if (0.001 <= x && x <= 0.009) {...} bana biraz daha net geliyor :)
Omri

50

İşte tek karşılaştırmalı bir seçenek.

// 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

Bu tatlıdır, min daha düşük veya max daha düşük olsa da yine de çalışacaktır. Aslında, başlangıç, bitiş gibi min, max olarak adlandırmak daha iyi olabilir. her iki şekilde de büyük algo teşekkürler!
James Harrington

LÜTFEN birisi zaman karmaşıklığını düşünmeyecek mi? Kabul edilen çözümü tercih ederim çünkü Θ (2) 'deki iki karşılaştırma, O (4)' te bir karşılaştırma ve üç aritmetik işlemden daha iyidir.
Matt McCarthy

Kendini hayal ettiğin şey olduğunu asla iddia etmedim. Yine de geçerli bir seçenektir.
İskender

19

Bir normal ifade kullanmanız gerekiyorsa (ve gerçekten kullanmamalısınız!) Bu işe yarayacaktır:

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

yani çalışmalı

  • ^ daha önce hiçbir şey
  • ardından 0.00(nb: .karakter için ters eğik çizgi çıkışı )
  • ardından 1'den 8'e kadar ve herhangi bir sayıda ek rakam
  • veya 9, ardından herhangi bir sayıda sıfır
  • $: ardından başka hiçbir şey yok

8

Zaten kullanıyorsanız lodash, şu inRange()işlevi kullanabilirsiniz : 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

Pointy'nin betweenişlevini seviyorum, bu yüzden senaryom için iyi çalışan bir benzerini yazdım.

/**
 * 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;
}

yani, aşağıdakilerin x± 10 aralığında olup olmadığını görmek istiyorsanız y:

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

Cep telefonunda uzun basmayı tespit etmek için kullanıyorum:

//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

Kodunuzun belirli bir rakam aralığı seçmesini istiyorsanız, &&yerine operatörü kullandığınızdan emin olun ||.

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

Koşulu yazmadan önce alt ve üst sınırı belirlemek istemelisiniz

function between(value,first,last) {

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.