使用Java检查变量是否在两个数字之间

22

我对这段代码有问题:

if (90 >>= angle =<< 180)

错误的解释是:

赋值语句左侧必须是一个变量。

我理解这句话的意思,但是我该如何将上述代码转换为正确的代码呢?


你应该更新你的问题并解释你想要做什么或测试什么。if (90 >>= angle =<< 180 ) 没有意义,而且我不清楚你是否正在做你认为你正在做的事情。 - jww
已添加 [tag:java] 标签,基于您编写 Java 代码的假设。如果有误,请随时更正。 - Bernhard Barker
@Dukeling,为什么你认为这是Java而不是C、C++、C#、JavaScript呢? - Miserable Variable
据我所知,Android开发主要是Java。@MiserableVariable之前提到了Android(出于简洁起见我将其删除了),而这个错误是Java IDE/编译器的错误(虽然我当然不是说它不能是其他语言的错误,因此有了这个评论)。 - Bernhard Barker
感谢您的评论,我刚开始使用Eclipse/Java编写代码,这是我的第一篇文章。非常感谢所有的评论。 - matthijsW
如果这确实是Java代码,>>=不是比较运算符,而是位移赋值运算符。 - killjoy
10个回答

64

我看到您的代码中有一些错误。
您可能使用了数学术语

90 <= angle <= 180,意思是角度在90-180范围内。

if (angle >= 90 && angle <= 180) {

// do action
}

我们不能这样写 if(90<=angle<=180) 吗? - shreedhar bhat
1
首先,这不是等价的:请注意比较的顺序。其次,Java没有三元“<=”运算符。它需要两个参数并返回一个布尔值。由于除赋值外的所有运算符都是从左到右进行评估的,因此这将关联为(90 <= angle) <= 180,这是将布尔值与整数进行比较,这是不允许的。 - Doradus

5
//If "x" is between "a" and "b";

.....

int m = (a+b)/2;

if(Math.abs(x-m) <= (Math.abs(a-m)))

{
(operations)
}

//如果总和不是偶数,就必须使用浮点数转换;

简单的例子:

//if x is between 10 and 20

if(Math.abs(x-15)<=5)

1
抱歉评论了一篇旧帖子,但这是我正在寻找的正确答案,因为在我的情况下,我事先不知道a和b的值。 - hoangbv15
2
虽然在数学上它可能很优雅(至少在特定的思维模式下),但是它有很多问题:代码意图不清晰,任何错误都不会突出显示,在源代码和字节码中执行更多操作,如果发生浮点溢出将导致错误答案。 - toolforger

5

1
链接回答是不鼓励的,请在您的回答中包含相关信息。阅读[答案]以获取更多信息。 - JoSSte

5

2
为什么不直接写成 return i >= minValueInclusive && i <= maxValueInclusive 呢? - user
当然可以。但是你的语法适用于高级开发人员。 - user2569050
2
很少有必要在检查布尔值后手动返回它们,而且这样做会更简单(至少对我来说)。 - user

3

<<= 表示“左移赋值”,类似于 +=。例如 x <<= 1 是指 x = x << 1。这就是为什么 90 >>= angle 无法解析的原因。另外,正如其他人所说,Java 没有一种优雅的语法来检查某个数字是否在一个区间内,所以您必须按照长时间的方式来做。它也不能执行 if (x == 0 || 1),只能将其写成冗长的形式。


2

您是否在为Android编写Java代码?如果是的话,您应该写成:

也许应该这样写:

if (90 >= angle && angle <= 180) {

如果将代码更新为更好的样式(如某些建议),则会得到:

if (angle <= 90 && angle <= 180) {

现在你可以看到第二个检查是不必要的,或者可能在第一个检查中混淆了<>符号,并且实际上想要...
if (angle >= 90 && angle <= 180) {

2
我取消了踩的操作,因为它的风格更接近于典型的数学术语 90 <= angle <= 180;(而且这与是否为安卓无关) - AlexWien
1
如果角度小于或等于90度,那么它不也小于或等于180度吗?我有什么遗漏的吗? - matt forsythe
是的,可能是原始代码中存在的一个错误,许多人已经指出了 - 我会更新我的答案。 - peter

1

我认为使用org.apache.commons.lang3.Range是一个不错的解决方案。它还可以与Guava Preconditions很好地集成,用于参数检查。下面是一些示例代码:

import org.apache.commons.lang3.Range;

import java.util.List;

class Scratch {
    public static void main(String[] args) {
        // Create a range object
        Range<Double> validRange = Range.between(90.0, 180.0);
        // and some test values
        List<Double> testValues = List.of(65.3, 89.99, 90.0, 90.11, 134.4, 177.7, 180.00, 180.000001, 32321.884);
        // Test them all
        for (Double testValue : testValues) {
            // Check if it's in the range
            final boolean inRange = validRange.contains(testValue);
            System.out.println(String.format("[%f] in range [%b]", testValue, inRange));
        }
    }
}

它会打印出来

[65.300000] in range [false]
[89.990000] in range [false]
[90.000000] in range [true]
[90.110000] in range [true]
[134.400000] in range [true]
[177.700000] in range [true]
[180.000000] in range [true]
[180.000001] in range [false]
[32321.884000] in range [false]

0
假设您正在使用Java编程,这样可以实现:
if (90 >= angle  &&  angle <= 180 )  {

(你是不是想说90度是小于角度angle?如果是的话,应该这样写:90 <= angle


这是一个风格问题,但我知道很多写C/C++的人总是将赋值写在左边,这样如果他们忘记了 = ,编译器就会报错 ... if (9 = x) - 编译错误 - if (x = 9) - 在C中始终有效 - peter
@zahorak 如果 (9 == x) 这是丑陋的 C 风格,不必要在 Java 中,因为 if (9 = x) 是不可能的。这样的符号只用于 "string".equals(otherString); - AlexWien
我理解你的选择。风格是主观的。你的风格不同。我不会因为这个而给你点踩。 - aliteralmind
我的意思是角度必须为90度或更大,小于180度。我用以下代码解决了这个问题:if (angle >= 90 && angle < 180) { - matthijsW
我试图取消踩(不起作用,需要编辑),因为它具有更接近典型数学术语90 <= angle <= 180的某些风格;但是对于像if (90 > alpha)这样的代码,我仍然会踩。而且风格不仅仅是主观的(请参见Checkstyle和代码格式规则)。但是你的代码符合checkstyle的要求。 - AlexWien
修改了。同意需要反转 90 >= angle,但正如我在答案中提到的那样,很明显 OP 的意思是在 90 到 180 之间,这就是为什么我保留它的原因。感谢取消点赞。 - aliteralmind

0

我认为使用静态方法可以提高可读性,如果将这种静态方法定义为标准,还可以在性能方面有所改进: 比如说,在java.lang.Math中,你可以有一个方法isBetween(int toCheck, int from, int to),它的定义如下:

public static boolean isBetween(int toCheck, int from, int to){
  // eventually validate the range
  return from <= toCheck && toCheck <= to;
}

第一个好处是,如果你import static Math.isBetween,那么你可以像这样编写代码

if(isBetween(userInput, 0, 16)){
  //...
}

第二个好处是,多次调用此方法(例如在字符串、数组或其他静态大小的数据结构中进行边界检查)可以导致易于C2编译的方法(可能是内联的),最终如果有人指出HotSpot编译器生成了分支,由于存在条件跳转,则可以编写一个改进,生成无分支代码,每个应用程序都可以受益,只需升级到更高版本的运行时。

另一个可读性的改进可以来自Valhalla项目:如果int可以有方法,那么您只需编写if(userInput.isBetween(0, 16))


-1
if (age >= 90 && age <=180) {
    // statements
}

这个检查是一个数字是否在某个范围内,你还可以使用一个内置函数叫做Range或者其他有用的内置函数,比如range between。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接