摄氏度总是0.0?

时间:2014-02-07 17:58:19

标签: java swing joptionpane

我正在用Java制作一个简单的温度转换程序,将华氏温度转换为摄氏温度。我的程序编译得很好,但无论我输入什么数字,它总是说Celsius是0.0!我能做错什么?这是我的完整代码:

import javax.swing.JOptionPane;

public class FahrenheitToCelsius {

public static void main(String[] args) {

    double fahrenheit, celsius;

    String input = JOptionPane.showInputDialog("Please enter the temperature in Fahrenheit:");

    fahrenheit = Double.parseDouble(input.trim());

    celsius = (5 / 9) * (fahrenheit - 32);

    JOptionPane.showMessageDialog(null, "The temperature is " + celsius + " degrees celsius.");

    }

}

4 个答案:

答案 0 :(得分:5)

这是因为(5/9)= 0。

5和9都是intsint除法在这里得到0(5/9 = 0.555 ......,不能是int所以它是截断为0)。使用双打(5.0 / 9.0),你就不会遇到这个问题。

答案 1 :(得分:4)

在这一行:

 celsius = (5 / 9) * (fahrenheit - 32);

5和9都是整数常量,这意味着计算出的值将被截断为0。

尝试改为:

celsius = (5.0 / 9) * (fahrenheit - 32);

答案 2 :(得分:3)

您收到05 / 9始终为0

你可以做这样的事情

celsius = ((fahrenheit - 32.0) * 5.0) / 9.0;

答案 3 :(得分:1)

这将有效:

celsius = ((fahrenheit - 32) * 5) / 9;

这种作用的原因与操作数的分组方式有关。在fahrenheit - 32中,fahrenheitdouble32int,因此32提升一个double,结果是double。然后,在:

(fahrenheit - 32) * 5

(fahrenheit - 32)double(见上文),5int,因此5被提升为double并且得到的乘法是double。再次:

((fahrenheit - 32) * 5) / 9

现在(fahrenheit - 32) * 5double,正如我们上面所见,9int,因此9得到提升,我们最终具有双精度浮点除法。

相比之下:

celsius = (fahrenheit - 32) * (5 / 9);

/,5和9的操作数都是int。因此没有促销,程序执行整数除法,结果为int。结果将为0.现在,由于fahrenheit - 32double0将被提升为double - 但当然为时已晚。

重点是Java编译器不是读者;尽管这两个表达式在数学上看起来相同,但编译器有一个非常具体的方法来处理它,程序员必须意识到这一点。