【问题标题】:Java program error, converting Farenheit to Celsius [closed]Java程序错误,将华氏温度转换为摄氏温度[关闭]
【发布时间】:2014-05-01 18:20:10
【问题描述】:

我在使用 Java 程序时遇到问题,Java E6B 飞行计算机突然停止将华氏温度转换为摄氏温度,它始终输出 0,无论是什么值,摄氏温度到华氏温度的写法相似并且工作正常,两个函数都写入一个日志文件,这是有效的,除了华氏度到摄氏温度对于日志文件中的任何输入都显示为 0。 (我知道我拼错了华氏度)。我考虑过改成 Double 而不是浮点数

这是两个函数的代码。还包括舍入功能。

public static String celstofare(String Celsius){

    // function level
    float a;
    // if user types string, returns error
    try
    {
        a = Float.parseFloat(Celsius);
                    float math = ((a * (9/5)) + 32);
                    String out = round(math, 2) +"";
                    // log file update mechanism
                            File file = new File("log.txt");
                            FileWriter writer;
                            try {
                                writer = new FileWriter(file, true);
                                PrintWriter printer = new PrintWriter(writer);
                                Date date = new Date();
                                String strDate = date.toString();
                                printer.println("Converted Celsius to Farenheit  on: " + strDate);
                                printer.println("Celsius: " + a + "Farenheit: " + out);
                                printer.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
        return out;
    }
    catch (Exception e)
    {
        return "error";
    }

}

    public static String faretocels(String Farenheit){

    // function level
    float a;
    // if user types string, returns error
    try
    {
        a = Float.parseFloat(Farenheit);
                    float math = ((a - 32) * (5/9));
                    String out = round(math, 2) +"";
                    // log file update mechanism
                            File file = new File("log.txt");
                            FileWriter writer;
                            try {
                                writer = new FileWriter(file, true);
                                PrintWriter printer = new PrintWriter(writer);
                                Date date = new Date();
                                String strDate = date.toString();
                                printer.println("Converted Farenheit to Celsius on: " + strDate);
                                printer.println("Farenheit: " + a + "Celsius: " + out);
                                printer.close();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
        return out;
    }
    catch (Exception e)
    {
        return "error";
    }

}
    public static BigDecimal round(double d, int decimalPlace) {
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);       
    return bd;
}

这里是调用它的函数和动作监听器,其他一切正常,我已经验证了正确的输入和输出设置。输入和输出框是 JTextFields

        else if (e.getSource() == btnCalculateConversion){
                    mphOut.setText(Conversions.KnotstoMph(knots.getText()));
                    knotsOut.setText(Conversions.mphtoknots(mph.getText()));
                    nmout.setText(Conversions.mphtoknots(mph.getText()));
                    miout.setText(Conversions.KnotstoMph(knots.getText()));
                    poundsout.setText(Conversions.galtopound(gal.getText()));
                    galout.setText(Conversions.poundtogal(pounds.getText()));
                    tempfout.setText(Conversions.celstofare(tempc.getText()));
                    tempcout.setText(Conversions.faretocels(tempf.getText()));

【问题讨论】:

  • 您的 5/99/5 的算术正在使用 integer 算术执行...试试 5f/99f/5
  • 5/9int 除数,并且始终等于 0。

标签: java math floating-point type-conversion jtextfield


【解决方案1】:

所有的答案都很好,但我再补充一点,因为你是学生:

该方法应该只做一件事:将温度从华氏温度转换为摄氏度。而已。不写入文件或其他任何东西。在方法之外执行此操作。

你到底为什么要传入和传出字符串?温度是数字;使用它们。

了解 Sun Java 编码标准。变量名以小写字母开头,类名以大写字母开头。

所以你的方法应该是这样的:

public class TemperatureConverter {

    private TemperatureConverter() {}

    public static double celciusToFarenheit(double celcius) {
        return 1.8*celcius + 32.0;    
    }

    public static double farenheitToCelcius(double farenheit) {
        return (farenheit - 32.0)/1.8;
    }
}

【讨论】:

  • 当时我认为将其写入函数内部的文件比让函数将字符串发送到函数以告知计算内容会更容易。我也传入和传出字符串,因为值是输入和输出到 JTextField。
  • 天哪,不。好的设计说明一个功能可以做好一件事。我理解来自 UI 输入的字符串,但您应该验证它们并将它们绑定到数字。如果我在文本框中输入“AAA”,函数会做什么?您的应用程序应确保输入是正确的数字,并告诉用户如果不是。它被称为“按合同编程”。当您让签名这样说时,您的功能是说“我只接受有效数字”。为客户提供的好信息。
  • 如果你输入 AAA 函数返回字符串 "error" 我只接受数字会造成在文本字段中占用太多空间的问题,错误非常适合,除了它已经这样做了没有意义现在改变它。
  • 已经完成了吗?如果您想正确执行任何代码,都可以轻松更改。这是你的葬礼。
  • 它已经上交了,它是一个学校项目
【解决方案2】:
float math = ((a * (9/5)) + 32);

9/5 被计算为整数除法,或 1。a * 9 / 5 可以避免这个问题,因为计算是从左到右的。

奇怪的是,这应该导致每次的温度为a + 32,而不是0。所以可能的含义是CelsiusparseFloat 中被评估为0。您是否尝试过单步调试器,看看a 的值是多少?

【讨论】:

    【解决方案3】:

    因为当您在从华氏温度转换为摄氏温度时进行 5/9 除法部分时,Java 认为它是纯整数除法,并且会向下舍入到零,然后假设您在从原始温度减去 32 后乘以零。

    解决方案是强制 Java 进行浮点除法,这可以通过执行 5.0/9、5/9.0 甚至 5.0/9.0 之类的操作来完成。然后 Java 将确保不会发生四舍五入到零,并且您的答案不会为零,除非需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多