0

可以理解的是:

  public int divide() {

  return 23/4; /* gives 5 , implicitly typecasting 5.75 to 5 ,due to 23 and 4 being
                  both integers ,at least I think this is */
  }

并且 ,

public double divide() {

  return 23.0/4.0; /*gives 5.75 , since it takes 23.0 and 4.0 to be float and not int*/

}

我有一个代码:

public double divide() {

  double intger = 23/4;
  return intger;

}

在其中,为什么即使我将 23/4 分配给双精度,我得到的只是 5.0?并且请检查我是否正确理解了前两个。

谢谢。

编辑:

我得到了答案。感谢所有帮助过的人。

4

6 回答 6

4

23/4是一个 int,然后隐式转换为 double。

编辑:试试这个

System.out.println(23/4);
System.out.println((double)(23/4));
System.out.println((double)23/(double)4);
于 2013-08-15T06:27:03.897 回答
2

int / int = int所以你将一个整数分配给一个双精度数。首先,你应该得到一个 double 值。

试试这个:

public double divide() {

  double toret = 23/4.0;
  return toret;

}
于 2013-08-15T06:27:55.577 回答
2

表达式23/4是整数除法,并给出integer结果。

因此它评估为 5,然后将其分配给您的double.

于 2013-08-15T06:28:58.433 回答
2

双整数 = 23/4;

一步步:

  1. 23/4 - 整数除法,因为两个参数都是 int;结果是 5
  2. 双整数 = 5; 需要转换,因为左值是double,而右值是int;int 到 double 的转换可以是隐式的;所以整数 = 5.0

如果你想进行浮点除法 - 只需除浮点数:

  double intger = 23.0 / 4.0;
于 2013-08-15T06:30:35.250 回答
1

23/4 是一个整数..您已经在两个整数之间进行了除法,所以结果是一个整数.. 5,它存储为双精度 5.0 ..

如果您希望返回双精度值,请使用:

public double divide() {

  double intger = 23.0/4.0;
  return intger;

}
于 2013-08-15T06:31:52.627 回答
1

在您的第一个示例中,23/4 返回 5,因为这就是整数除法的作用:p/q 返回满足 i*q <= p 的最大整数 i。这里没有铸造!

在您的第二个示例中,23.0/4.0 返回 5.75,因为这是浮点除法的工作原理:当 p 和 q 是浮点数时,p/q 返回 f 的最精确表示,使得 f * q = p。

在您不考虑的情况下,23.0/4 也将返回 5.75。在这种情况下,有铸造。由于 p 和 q 是不同的类型,float 和 int,所以在不损失精度的情况下提升了较低的类型,并且除法继续进行,就好像 p 和 q 一直是较高的类型一样。

在您担心的情况下,始终可以使用 int 将值分配给更高类型的变量(long、float 或 double)。这里发生的是整数除法,然后是提升。

为了强制浮点除法,将 p 或 q 之一转换为浮点:

public double divide(int p, int q) {

  return  (double)p/q;
}
于 2013-08-15T06:38:09.760 回答