【问题标题】:How do you find if a number is within a range in Java? Problems with Math.abs(num1-num2) <= inRange你如何找到一个数字是否在Java的范围内? Math.abs(num1-num2) <= inRange 的问题
【发布时间】:2011-11-02 06:55:54
【问题描述】:

我在另一个问题中看到,查找您的号码是否在一个范围内的解决方案是,

Math.abs(num1-num2) <= inRange

inRange 是您要确定的数字是否在 num2 和 num1 之间的范围内。

当我插入这些数字时,这个公式对我来说是错误的。

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

我试图找出 -5 是否介于 -25 和 25 之间。这个等式是错误的,即使答案是正确的,-5 介于 -25 和 25 之间。

请为我澄清!

【问题讨论】:

  • 这个公式看起来肯定有问题。只是好奇,如果你有边界和数字,你不能只做一个简单的条件 (a

标签: java math


【解决方案1】:

我完全没有理由使用Math.abs。我会使用:

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

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

如果您希望上限也包含在内。

确实,Math.abs() 方法似乎完全被破坏了 - 我强烈怀疑你误解了它作为解决方案提出的问题。

【讨论】:

    【解决方案2】:

    对于奖励积分,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 in -25..+25: 假
    -25 在 -25..+25 中:是的
    -24 在 -25..+25 中:是的
    -1 在 -25..+25 中:真
    -25..+25 中的 0:真
    1 in -25..+25: 真
    24 英寸 -25..+25:是的
    25 英寸 -25..+25:是的
    26 英寸 -25..+25:错误

    Range 类支持开放和封闭范围、从 -INF 到 +INF 的范围,以及各种范围相关的操作,如成员资​​格、交集和跨度。

    【讨论】:

    • 从 Guava 14 开始,您应该在 Range 本身上使用静态方法来实例化 Ranges(Ranges 已弃用),例如Range.closed(-25, +25).
    【解决方案3】:

    只要做:

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

    您当前的方法只是检查数字范围。实际上是最小和最大的数字距离。

    【讨论】:

      【解决方案4】:

      下面的表达式将检查x 是否在ab 之间:

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

      【讨论】:

      • 你的方式比较棘手,但不是开发中使用的方式,乍一看不太清楚,应该可以证明,所以最好用可读性更高的代码。
      【解决方案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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-04
          • 1970-01-01
          相关资源
          最近更新 更多