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

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

Math.abs(num1-num2) <= inRange

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

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

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

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

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

Ответы [ 5 ]

25 голосов
/ 02 ноября 2011

Не вижу смысла использовать Math.abs вообще. Я бы использовал:

if (lowerBound <= value && value < upperBound)

или

if (lowerBound <= value && value <= upperBound)

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

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

6 голосов
/ 02 ноября 2011

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

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

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

4 голосов
/ 02 ноября 2011

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

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: ложь-25 в -25 .. + 25: правда-24 в -25 .. + 25: правда-1 в -25 .. + 25: правда0 в -25 .. + 25: верно1 в -25 .. + 25: правда24 в -25 .. + 25: правда25 в -25 .. + 25: правда26 в -25 .. + 25: ложь

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

1 голос
/ 02 ноября 2011

Ниже выражения проверит x между a и b:

Math.abs(x - a) + Math.abs(b - x) == Math.abs(b - a)
0 голосов
/ 30 октября 2018

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

int x = 5;
int bounds = 25;
if(Math.abs(x) <= bounds) {
    //run if x is anywhere between -25 and 25
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...