我正在用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.");
}
}
答案 0 :(得分:5)
这是因为(5/9)= 0。
5和9都是ints
,int
除法在这里得到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)
您收到0
因5 / 9
始终为0
。
你可以做这样的事情
celsius = ((fahrenheit - 32.0) * 5.0) / 9.0;
答案 3 :(得分:1)
这将有效:
celsius = ((fahrenheit - 32) * 5) / 9;
这种作用的原因与操作数的分组方式有关。在fahrenheit - 32
中,fahrenheit
是double
而32
是int
,因此32
将提升一个double
,结果是double
。然后,在:
(fahrenheit - 32) * 5
(fahrenheit - 32)
是double
(见上文),5
是int
,因此5
被提升为double
并且得到的乘法是double
。再次:
((fahrenheit - 32) * 5) / 9
现在(fahrenheit - 32) * 5
是double
,正如我们上面所见,9
是int
,因此9
得到提升,我们最终具有双精度浮点除法。
相比之下:
celsius = (fahrenheit - 32) * (5 / 9);
/
,5和9的操作数都是int
。因此没有促销,程序执行整数除法,结果为int
。结果将为0.现在,由于fahrenheit - 32
是double
,0
将被提升为double
- 但当然为时已晚。
重点是Java编译器不是读者;尽管这两个表达式在数学上看起来相同,但编译器有一个非常具体的方法来处理它,程序员必须意识到这一点。