Java 如何确定给定各种温度输入的标准化温度?

Java 如何确定给定各种温度输入的标准化温度?,java,normalization,Java,Normalization,我需要使用一个标准化的温度值来检查是否有人生病 我已经编写了一个从摄氏度转换为华氏度的函数,但需要使用标准化温度编写相同的函数 public void hasFever(int temperature1, int temperature2, int temperature3, int temperature4, String bodylocation) throws ArithmeticException, InputMismatchException { final int noOfT

我需要使用一个标准化的温度值来检查是否有人生病

我已经编写了一个从摄氏度转换为华氏度的函数,但需要使用标准化温度编写相同的函数

public void hasFever(int temperature1, int temperature2, int temperature3, int temperature4, String bodylocation) throws ArithmeticException, InputMismatchException {
    final int noOfTimesTempTaken = 4;
    if(bodylocation == "ear") { //Determine if someone has fever if temperature was taken by the ear
        final double feverTemperature = 98.6;   
        double temperature1InFahrenheit = (temperature1 * 9/5) + 32;
        double temperature2InFahrenheit = (temperature2 * 9/5) + 32;
        double temperature3InFahrenheit = (temperature3 * 9/5) + 32;
        double temperature4InFahrenheit = (temperature4 * 9/5) + 32;
        double avgTemp = (temperature1InFahrenheit + temperature2InFahrenheit + temperature3InFahrenheit + temperature4InFahrenheit) / noOfTimesTempTaken;
        if(avgTemp >= feverTemperature) {
            System.out.println("This person has a fever because their temperature of " + avgTemp + " is greater than normal which is 98.6");
        } else {
            System.out.println("This person does not have a fever because their temperature of " + avgTemp + " is less than normal which is 98.6");
        }
    }
}

首先,应注意,标准化温度不是一个具有公认/标准含义的术语,在这里不适用。术语normalize有时用于表示“调整以处理测量误差”,但这并不是您在这里想要做的

(必须指出的是,您尚未成功澄清“正常化”的含义,因此我们不得不猜测。根据您所说的,这是我最好的猜测。)

我想你正在寻找这样的东西:

double VALID_FAHRENHEIT_TEMP_THRESHOLD = 60.0;  // say

public double normalizeToFahrenheit(double temp) {
    if (temp >= VALID_FAHRENHEIT_TEMP_THRESHOLD) {
        return temp;
    } else {
        return temp * (9.0 / 5.0) + 32.0;
    }
}
  The temperature xy degrees is outside of the expected range for human 
  temperatures in Fahrenheit.  

  Options: 

     1) Accept as a Fahrenheit value.  
     2) Apply Centigrade to Fahrenheit conversion. 
     3) Switch device to Centigrade mode.  
     4) Reenter value.
但问题是,这种“规范化”在科学和数学上都是不合理的。我们假设,如果一个数字小于某个特定值,它必须以摄氏度而不是华氏度为单位。但这并不一定是真的。摄氏度和华氏度都降到很低的值

更实际的是,如果有人溺死在冰冷的水中,他们的体温可能会下降很多。。。可能接近冰点。我们选择的门槛可能会更低。如果我们假设温度“必须”为摄氏度并将其转换,我们报告的温度不正确

一个相关的问题是,奇怪的温度值可能是由于用户未读取温度计、未听到测量值或未键入值造成的;e、 g.
11.3
而不是
101.3
。对错误输入应用规范化将导致更具误导性的结果


因此,考虑到这种“规范化”方法是无效的,您应该怎么做呢

我的建议是让你的应用程序向用户报告异常情况。例如,向他们显示如下对话框:

double VALID_FAHRENHEIT_TEMP_THRESHOLD = 60.0;  // say

public double normalizeToFahrenheit(double temp) {
    if (temp >= VALID_FAHRENHEIT_TEMP_THRESHOLD) {
        return temp;
    } else {
        return temp * (9.0 / 5.0) + 32.0;
    }
}
  The temperature xy degrees is outside of the expected range for human 
  temperatures in Fahrenheit.  

  Options: 

     1) Accept as a Fahrenheit value.  
     2) Apply Centigrade to Fahrenheit conversion. 
     3) Switch device to Centigrade mode.  
     4) Reenter value.

我希望我正确理解你的问题。所以你想把一个通用的温度单位传给你的函数

class Temperature {
    private final static double CELSIUS_OFFSET = 273,15;
    private final static double FAHRENHEIT_OFFSET = 32;
    private final static double FAHRENHEIT_FACTOR = 9.0 / 5.0;
    private final double tempInKelvin;

    private Temperature() {
        //Private constructor, so only this class can access it
    }

    public static Temperature fromKelvin(double tempInKelvin) {
        final Temperature temperature = new Temperature();
        temperature.tempInKelvin = tempInKelvin;
        return temperature;
    }

    public static Temperature fromCelsius(double tempInCelsius) {
        return fromKelvin(tempInCelsius - CELSIUS_OFFSET);
    }

    public static Temperature fromFahrenheit(double tempInFahrenheit) {
        return fromCelsius((tempInFahrenheit - FAHRENHEIT_OFFSET) / FAHRENHEIT_FACTOR);
    }

    public double getInKelvin() {
        return tempInKelvin;
    }

    public double getInCelsius() {
        return tempInKelvin + CELSIUS_OFFSET;
    }

    public double getInFahrenheit() {
        return getInCelsius()*FAHRENHEIT_FACTOR + FAHRENHEIT_OFFSET;
    }
}
使用此类,您可以执行以下操作:

//Example use (has to be in a method, of course):
final Temperature temp1 = Temperature.fromCelsius(39.2);
final Temperature temp2 = Temperature.fromFahrenheit(95.3);
final Temperature temp3 = Temperature.fromCelsius(39.1);
final Temperature temp4 = Temperature.fromCelsius(39.3);
hasFever(temp1, temp2, temp3, temp4, "ear");

//New hasFever() method:
public void hasFever(Temperature temp1, Temperature temp2, Temperature temp3, Temperature temp4, String bodylocation) {
    final int noOfTimesTempTaken = 4;
    //USE String.equals()!!!
    if(bodylocation.equals("ear")) { //Determine if someone has fever if temperature was taken by the ear
        final double feverTemperature = 98.6;
        double avgTemp = (temp1.getInFahrenheit() + temp2.getInFahrenheit() + temp3.getInFahrenheit() + temp4.getInFahrenheit()) / noOfTimesTempTaken;
        if(avgTemp >= feverTemperature) {
            System.out.println("This person has a fever because their temperature of " + avgTemp + " is greater than normal which is 98.6");
        } else {
            System.out.println("This person does not have a fever because their temperature of " + avgTemp + " is less than normal which is 98.6");
        }
    }
}

现在您有了一个通用的
Temperature
类,它基本上没有可访问的单元,直到您指定了所需的单元。这也可以为您转换所有单位。

如果您能告诉我们您的问题到底是什么,我会很高兴。您得到的输出是什么?那么预期的输出是什么呢?您没有任何代码,这些代码可能引发
算术异常
输入不匹配异常
,因此您可以删除
引发算术异常、输入不匹配异常
。另外,
算术异常
是一种异常,因此不必出现在方法签名中。我的问题在于如何将我的温度变量“转换”为标准化温度,该温度可以根据最低温度进行评估,以确定患者是否生病。可能只有我一个人,但我不知道“标准化”是什么意思“。你能给我解释一下在这种情况下这意味着什么吗?因为温度可以用摄氏度或华氏度来测量(我将摄氏度转换为华氏度的原因),然后再根据发烧温度来评估温度值。我想重构这个函数,以便能够比较钙或华氏温度值(无需从一个单位转换到另一个单位),以确定患者是否生病。