检查数字是否已超过特定边界

时间:2020-10-20 15:58:55

标签: java

我有一个恒温器,当温度变化0.1 * C时,该恒温器会调用tempChange(oldTemp, newTemp),这对于我的用例来说太频繁了。我想添加一个if()以在温度达到或超过一半或整个温度时过滤掉。

我不确定如何开始编码hasNewTempPassedHalfOrWholeDegree(oldTemp, newTemp)

public void tempChange(Double oldTemp, Double newTemp) {
    if (hasNewTempPassedHalfOrWholeDegree(oldTemp, newTemp)) {
        // temperature is valid to process
    }
}

有效的温度变化将是新温度已超过一半或整个温度(即:20.0、20.5、21.0、21.5)的温度变化。换句话说,就像@Aioros所说的那样:我试图找到“两个温度之间的间隔,该间隔包括一个整数或一个整数+ 0.5。”

温度时间表和预期结果的示例:

{ oldTemp:19.7, newTemp:20.0 } // valid
{ oldTemp:20.0, newTemp:20.2 } // not valid
{ oldTemp:20.2, newTemp:20.6 } // valid
{ oldTemp:20.6, newTemp:21.7 } // valid
{ oldTemp:21.7, newTemp:21.6 } // not valid
{ oldTemp:21.6, newTemp:21.5 } // valid
{ oldTemp:21.5, newTemp:21.2 } // not valid
{ oldTemp:21.2, newTemp:20.2 } // valid
{ oldTemp:20.2, newTemp:20.1 } // not valid

3 个答案:

答案 0 :(得分:1)

这是测试温度变化是否跨越.0或.5边界的一种方法。

private boolean hasNewTempPassedHalfOrWholeDegree(Double oldTemp, Double newTemp) {
    int oldTempInt = Math.round(10d * oldTemp);
    int newTempInt = Math.round(10d * newTemp);
    int start = Math.min(oldTempInt,  newTempInt);
    int end = Math.max(oldTempInt,  newTempInt);
    
    for (int index = start; index <= end; index += 10) {
        if (index % 50 == 0) {
            return true;
        }
    }
    
    return false;
}

答案 1 :(得分:1)

一种非常简单(不太优雅)的方法是将Double的值转换为BigDecimal并在范围内进行迭代,检查使用a除以0.5时,中间的值是否为零。经典的for循环:

public static void main(String[] args){
    double[][] test = {
        {19.7, 20.0}, // valid
        {20.0, 20.2}, // not valid
        {20.2, 20.6}, // valid
        {20.6, 21.7}, // valid
        {21.7, 21.6}, // not valid
        {21.6, 21.5}, // valid
        {21.5, 21.2}, // not valid
        {21.2, 20.2}, // valid
        {20.2, 20.1}, // not valid
    };
    for(double[] d : test){
        boolean b = hasNewTempPassedHalfOrWholeDegree(d[0],d[1]);
        System.out.println(Arrays.toString(d) + (b ? "valid" : "not valid"));
    }
}

static boolean hasNewTempPassedHalfOrWholeDegree(Double oldTemp, Double newTemp) {
    
    BigDecimal x = new BigDecimal(String.valueOf(oldTemp));
    BigDecimal y = new BigDecimal(String.valueOf(newTemp));
    
    BigDecimal d = new BigDecimal("0.1");
    BigDecimal h = new BigDecimal("0.5");
    
    if(x.compareTo(y) == 0){
        return false;
    }
    else if(x.compareTo(y) < 0){
        for (BigDecimal i = x.add(d); i.compareTo(y) <= 0; i = i.add(d)) {
            if (i.remainder(h).compareTo(BigDecimal.ZERO) == 0) {
                return true;
            }
        }
    }
    else {
        for (BigDecimal i = x.subtract(d); i.compareTo(y) >= 0; i = i.subtract(d)) {
            if (i.remainder(h).compareTo(BigDecimal.ZERO) == 0) {
                return true;
            }
        }
    }
    return false;
}

答案 2 :(得分:-1)

如果我正确理解了您要查找的内容,则可能会注意到两个数字ab之间的间隔在以下情况下包括整数或半整数:

FLOOR(2*b) > FLOOR(2*a).

所以您的情况看起来像这样:

if (Math.floor(2*newTemp) != Math.floor(2*oldTemp)) {
    // valid
} else {
    // not valid
}