【问题标题】:How to determine normalized temperature given various temperature inputs?给定各种温度输入,如何确定归一化温度?
【发布时间】:2019-12-12 01:36:25
【问题描述】:

我需要使用归一化的温度值来检查某人是否有病。

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

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

【问题讨论】:

  • 我会很好,如果你能告诉我们你的问题到底是什么。你得到什么输出?预期的输出是什么?
  • 您没有任何代码,可能会抛出ArithmeticExceptionInputMismatchException,因此您可以删除throws ArithmeticException, InputMismatchExceptionArithmeticException 也是 unchecked exception,因此不必在方法签名中。
  • 我的问题在于如何将我的温度变量“转换”为标准化温度,该温度可以根据 hotTemperature 进行评估以确定该人是否生病。
  • 可能只有我一个人,但我不知道你所说的“标准化”是什么意思。你能向我解释一下在这种情况下这意味着什么吗?
  • 因为在根据发烧温度评估值之前,可以用摄氏或华氏(我将摄氏转换为华氏的原因)来测量温度。我想重构该函数,以便能够比较温度值(无需从一个单位转换为另一个单位),以确定该人是否生病。

标签: java normalization


【解决方案1】:

首先,需要注意的是,标准化温度并不是一个具有公认/标准含义的术语,适用于此处。术语 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;
    }
}

但问题在于,这种“标准化”在科学和数学上都是不合理的。我们假设如果一个数字小于某个特定值,它必须以摄氏度而不是华氏度为单位。但这不一定是真的。摄氏度和华氏度都下降到非常低的值。

更实际地,如果有人淹死在冰冷的水中,他们的华氏温度可能会下降很多……可能接近冰点。它可能低于我们选择的阈值。如果我们假设它“必须”是摄氏度并转换它,我们会报告不正确的温度。

一个相关的问题是,一个奇怪的温度值可能是用户误读温度计、误听测量值或误输入值的结果;例如11.3 而不是 101.3。对错误的输入应用归一化会导致更多的误导性结果。


因此,鉴于这种“标准化”方法无效,您应该怎么做?

我的建议是让您的应用向用户报告异常情况。例如,向他们展示一个这样的对话框:

  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.

【讨论】:

    【解决方案2】:

    希望我能正确理解您的问题。因此,您想将通用温度单位传递给您的函数。

    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 类,它基本上没有可访问的单元,直到你指定你想要的。这也会为您转换所有单位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多