Как вы определяете, находится ли число в пределах диапазона в Java? Проблемы с Math.abs(num1-num2) <= inRange

#java #math

#java #математика

Вопрос:

Я видел в другом вопросе, что решение для определения того, находится ли ваше число в диапазоне, было,

 Math.abs(num1-num2) <= inRange
 

Где inRange — это число, которое вы пытаетесь выяснить, находится ли оно в диапазоне между num2 и num1.

Для меня эта формула прерывается, когда я вставляю эти числа.

 Math.abs(25-(-25)) <= -5
 

Я пытаюсь найти, находится ли -5 между -25 и 25. Это уравнение неверно, даже если ответ верен, -5 находится между -25 и 25.

Пожалуйста, уточните для меня!

Комментарии:

1. формула определенно выглядит глючной. Просто любопытно, если у вас есть границы, а также число, разве вы не можете просто выполнить простое условие (a <= n <= b)? Я имею в виду, есть ли в этих вычислениях какой-то смысл в отношении прямого сравнения, который я упускаю?

Ответ №1:

Я не вижу никаких причин для использования Math.abs вообще. Я бы использовал:

 if (lowerBound <= value amp;amp; value < upperBound)
 

или

 if (lowerBound <= value amp;amp; value <= upperBound)
 

если вы хотите, чтобы верхняя граница тоже была инклюзивной.

Действительно, Math.abs() подход кажется полностью нарушенным — я сильно подозреваю, что вы неправильно поняли вопрос, в котором он был задан как решение.

Ответ №2:

Для получения бонусных баллов в Guava 10.x введен новый класс Range (используемый с диапазонами вспомогательных классов).:

 import com.google.common.collect.Range;
import com.google.common.collect.Ranges;

public class RangeTest {

    Range<Integer> range = Ranges.closed(-25,  25);

    public boolean rangeTest(Integer candidate) {
        return range.contains(candidate);
    }

}


public class TestMain {
    static RangeTest rangeTest = new RangeTest();

    public static void doTest(Integer candidate) {
        System.out.println(candidate   " in -25.. 25: "
                  rangeTest.rangeTest(candidate));
    }

    public static void main(String[] args) {
        doTest(-26);
        doTest(-25);
        doTest(-24);
        doTest(-1);
        doTest(-0);
        doTest( 1);
        doTest( 24);
        doTest( 25);
        doTest( 26);
    }

}
 

Выходной сигнал:

-26 в -25.. 25: false
-25 в -25 .. 25: true
-24 в -25.. 25: true
-1 в -25.. 25: true
0 в -25 .. 25: true
1 в -25 .. 25: true
24 в -25 .. 25: true
25 в -25 .. 25: истина
26 в -25.. 25: ложь

Класс Range поддерживает открытые и закрытые диапазоны, диапазоны от -INF до INF и все виды операций, связанных с диапазоном, таких как членство, пересечение и диапазон.

Комментарии:

1. Начиная с Guava 14, вы должны использовать статические методы Range для создания экземпляра Range s ( Ranges устарел), например Range.closed(-25, 25) .

Ответ №3:

Просто делай:

 bool isInRange = Math.min(num1,num2) <= inRange 
                amp;amp; Math.max(num1,num2) >= inRange;
 

Ваш текущий подход просто проверяет диапазоны чисел. на самом деле наименьшее и наибольшее расстояние между числами.

Ответ №4:

Приведенное ниже выражение будет проверять x , находится ли оно между a и b :

 Math.abs(x - a)   Math.abs(b - x) == Math.abs(b - a)
 

Комментарии:

1. Ваш способ сложен, но это не тот способ, который можно использовать в разработке, он непонятен на первый взгляд и должен это доказать, поэтому лучше использовать более читаемый код.

Ответ №5:

Старый вопрос, однако метод Math.abs может быть более понятным в зависимости от того, над чем вы работаете, и его все равно стоит показать:

 int x = 5;
int bounds = 25;
if(Math.abs(x) <= bounds) {
    //run if x is anywhere between -25 and 25
}
 

Ответ №6:

у kotlin есть .. оператор

 if (center.x in 0..MaxX) {
                   //Do stuff
}
if (center.y !in 0..MaxY) {
                    //Do stuff
}