Java程序错误,将Farenheit转换为摄氏度
我遇到了一个java程序的问题,一台java E6B飞行计算机,突然它停止了华氏温度到摄氏温度的转换,它总是输出0,不管是什么值,摄氏温度到华氏温度写得相似,工作正常,两个函数都写到日志文件中,这样就可以了,除此之外,对于日志文件中的任何输入,华氏到摄氏的温度都显示为0。(我知道我拼错了华氏温度)。我考虑过换成双人的而不是浮动的 下面是这两个函数的代码。还包括舍入功能Java程序错误,将Farenheit转换为摄氏度,java,math,floating-point,type-conversion,jtextfield,Java,Math,Floating Point,Type Conversion,Jtextfield,我遇到了一个java程序的问题,一台java E6B飞行计算机,突然它停止了华氏温度到摄氏温度的转换,它总是输出0,不管是什么值,摄氏温度到华氏温度写得相似,工作正常,两个函数都写到日志文件中,这样就可以了,除此之外,对于日志文件中的任何输入,华氏到摄氏的温度都显示为0。(我知道我拼错了华氏温度)。我考虑过换成双人的而不是浮动的 下面是这两个函数的代码。还包括舍入功能 public static String celstofare(String Celsius){ // functio
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()));
9/5
被计算为整数除法,或1<代码>一个*9/5可以避免这个问题,因为评估是从左到右的
奇怪的是,这会导致每次的温度都是a+32
,而不是0
。因此,可能的含义是,摄氏度
在parseFloat
中被评估为0
。您是否尝试过单步通过调试器查看a
的值
9/5
被计算为整数除法,或1<代码>一个*9/5可以避免这个问题,因为评估是从左到右的
奇怪的是,这会导致每次的温度都是a+32
,而不是0
。因此,可能的含义是,摄氏度
在parseFloat
中被评估为0
。您是否尝试过单步通过调试器查看a
的值
9/5
被计算为整数除法,或1<代码>一个*9/5可以避免这个问题,因为评估是从左到右的
奇怪的是,这会导致每次的温度都是a+32
,而不是0
。因此,可能的含义是,摄氏度
在parseFloat
中被评估为0
。您是否尝试过单步通过调试器查看a
的值
9/5
被计算为整数除法,或1<代码>一个*9/5可以避免这个问题,因为评估是从左到右的
奇怪的是,这会导致每次的温度都是
a+32
,而不是0
。因此,可能的含义是,摄氏度
在parseFloat
中被评估为0
。您是否尝试过单步通过调试器查看a
的值是多少?因为当您在从华氏温度转换为摄氏温度时执行5/9除法部分,Java认为它是纯整数除法,将舍入到零,然后假设在原始温度减去32后乘以零
解决方案是强制Java进行浮点除法,这可以通过5.0/9、5/9.0甚至5.0/9.0来实现。然后Java将确保不会发生舍入到零的情况,并且您的答案不会是零,除非需要。因为当您在从华氏温度转换到摄氏温度时进行5/9除法运算时,Java认为它是纯整数除法,将舍入到零,然后假设在原始温度减去32后乘以零
解决方案是强制Java进行浮点除法,这可以通过5.0/9、5/9.0甚至5.0/9.0来实现。然后Java将确保不会发生舍入到零的情况,并且您的答案不会是零,除非需要。因为当您在从华氏温度转换到摄氏温度时进行5/9除法运算时,Java认为它是纯整数除法,将舍入到零,然后假设在原始温度减去32后乘以零
解决方案是强制Java进行浮点除法,这可以通过5.0/9、5/9.0甚至5.0/9.0来实现。然后Java将确保不会发生舍入到零的情况,并且您的答案不会是零,除非需要。因为当您在从华氏温度转换到摄氏温度时进行5/9除法运算时,Java认为它是纯整数除法,将舍入到零,然后假设在原始温度减去32后乘以零
解决方案是强制Java进行浮点除法,这可以通过5.0/9、5/9.0甚至5.0/9.0来实现。然后,Java将确保不会发生四舍五入到零的情况,并且您的答案不会为零,除非它需要为零。所有答案都非常好,但由于您是一名学生,我将补充一点: 这种方法应该做一件事,也只有一件事:将温度从法伦海特转换成塞尔修斯。就这样。禁止写入文件或其他任何内容。在方法之外这样做 你到底为什么要把线传来传去?温度是数字;使用它们 学习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;
}
}
所有的答案都很好,但我要补充一点,因为你是一名学生: 这种方法应该做一件事,也只有一件事:将温度从法伦海特转换成塞尔修斯。就这样。禁止写入文件或其他任何内容。在方法之外这样做 你到底为什么要把线传来传去?温度是数字;使用它们 学习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;
}
}
所有答案