检查数字是否已超过某个边界

  • 本文关键字:边界 数字 是否 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(;两个温度之间的间隔包括一个整数或一个整数+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

一种非常简单(不优雅(的方法可以是将Double值转换为BigDecimal,并在范围内迭代,使用经典的for循环检查两者之间的任何值除以0.5时是否留下零的余数

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;
}

这里有一种测试温度变化是否越过.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;
}

如果我正确理解您要查找的内容,您可能会注意到两个数字ab之间的间隔包括一个整数或一个整数半,当:

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

所以你的情况看起来像:

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

最新更新