2

我正在尝试将华氏温度转换为相应的摄氏度,所以我写道:

double f = 90.0;
double c = (90.0-32)*(5/9); // 0.0

但这不起作用,如果我不使用第二组括号会更好:

double c = (90.0-32)*5/9; // 32.2222

为什么这种(​​至少对我而言)奇怪的行为?

4

7 回答 7

3

不要在除法中使用整数,因为2/5 = 0但是2.0/5.0 = 0.4

于 2012-07-15T11:17:01.733 回答
2

你的问题在这里

double c = (90.0-32)*(5/9);

5 和 9 的整数除法将导致值为零。将 5 或 9 之一更改为 double 值:

double c = (90.0-32)*(5.0/9);

当你除以整数时,结果将是一个整数,当然整数不能存储结果的真实小数值,只能存储它的整数部分。

于 2012-07-15T11:18:10.643 回答
2

(90.0-32)*5/9被评估为((90.0-32)*5)/9,请注意除法发生在 double 和 int 之间(然后隐式转换为 double)。

(90.0-32)*(5/9)那里有,5/9它是零。

于 2012-07-15T11:20:21.297 回答
2

(5/9) 将给出 0 所以做类似 (5.0/9.0)

第二个:

double c = (90.0-32)*5/9;

有效,因为括号中的表达式是一个浮点数,然后您再次乘以和除以一个数字,因此最终结果保持为浮点数。

于 2012-07-15T11:20:46.487 回答
2

试试这个方法......

此示例显示,当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));
    }

}
于 2012-07-15T11:21:02.943 回答
2

您可以在初始化变量时尝试以下操作。

double f = 90D ;
float fl = 50F ;

因此,您不必每次都处理.0for 值。

于 2012-07-15T11:23:43.913 回答
1

在使用不同数据类型的数值表达式中,除非指定,否则默认选择是intand double

阅读有关原始数据类型的更多详细信息。

  1. 除非有原因,否则int数据类型通常是默认选择。

  2. 对于十进制值,双精度数据类型通常是默认选择。

在你的表达中:

double c = (90.0-32)*(5/9); // 0.0
  1. 59in 表达式(5/9)被视为int数据类型,因此除法的结果是0, int
  2. 表达式(90.0-32)将产生一个double,因为32是一个int
    你可能知道
    2.1. double */+/- int/long/float/double会导致一个double.
    2.2. 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

要了解有关明确表达式和语句的更多信息,另请参阅:
表达式、语句和块

于 2012-07-15T13:47:02.630 回答