我正在尝试将华氏温度转换为相应的摄氏度,所以我写道:
double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0
但这不起作用,如果我不使用第二组括号会更好:
double c = (90.0-32)*5/9; // 32.2222
为什么这种(至少对我而言)奇怪的行为?
我正在尝试将华氏温度转换为相应的摄氏度,所以我写道:
double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0
但这不起作用,如果我不使用第二组括号会更好:
double c = (90.0-32)*5/9; // 32.2222
为什么这种(至少对我而言)奇怪的行为?
不要在除法中使用整数,因为2/5 = 0
但是2.0/5.0 = 0.4
你的问题在这里
double c = (90.0-32)*(5/9);
5 和 9 的整数除法将导致值为零。将 5 或 9 之一更改为 double 值:
double c = (90.0-32)*(5.0/9);
当你除以整数时,结果将是一个整数,当然整数不能存储结果的真实小数值,只能存储它的整数部分。
(90.0-32)*5/9
被评估为((90.0-32)*5)/9
,请注意除法发生在 double 和 int 之间(然后隐式转换为 double)。
(90.0-32)*(5/9)
那里有,5/9
它是零。
(5/9) 将给出 0 所以做类似 (5.0/9.0)
第二个:
double c = (90.0-32)*5/9;
有效,因为括号中的表达式是一个浮点数,然后您再次乘以和除以一个数字,因此最终结果保持为浮点数。
试试这个方法......
此示例显示,当x 和 y 是整数时,返回的值为 0,但如果 x 和 y 为双倍,则其为 0.5555555555555556
public class Test{
public static void main(String[] args){
double x = 5.0;
double y = 9.0;
System.out.println((90.0-32.0)*(x/y));
}
}
您可以在初始化变量时尝试以下操作。
double f = 90D ;
float fl = 50F ;
因此,您不必每次都处理.0
for 值。
在使用不同数据类型的数值表达式中,除非指定,否则默认选择是int
and double
。
阅读有关原始数据类型的更多详细信息。
除非有原因,否则int数据类型通常是默认选择。
对于十进制值,双精度数据类型通常是默认选择。
在你的表达中:
double c = (90.0-32)*(5/9); // 0.0
5
和9
in 表达式(5/9)
被视为int
数据类型,因此除法的结果是0
, int
。(90.0-32)
将产生一个double
,因为32
是一个int
。double */+/- int/long/float/double
会导致一个double
. double divided_by_any int/long/float/double
会导致一个double
.牢记以上几点,表达式 forc
可以解释为
double c = (double)*(int);
double c = (90.0-32)*(0);
double c = 0.0; // double
因此 for 的结果c
将是 a double
0.0
。
表达方式
double c = (90.0-32)*5/9; // 32.2222
根据运算符优先级被解释为
double c = ( (90.0-32)*5 ) / 9; // ( (double - int) * int ) / int
//c = ( (58.0)*5 ) / 9; // ( (double) * int ) / int
//c = ( 290.0 ) / 9; // ( double ) / int
c = 32.22222222222222; // double
5
或者9
,对(5/9)
a的显式强制转换double
将导致32.22222222222222
.c
//double c = (90.0-32)*(5/9);
double c = (90.0-32)*( (double)5/9 ); // (double - int) * ( (double)int / int )
// or
//double c = (90.0-32)*( 5/(double)9 ); // (double - int) * ( int / (double)int )
//c = (58.0)*(5.0/9); // ( (double) * ( double / int )
//c = (58.0)*(0.5555555555555556); // ( double )*( double )
c = 32.22222222222222; // double
要了解有关明确表达式和语句的更多信息,另请参阅:
表达式、语句和块