11

我编写了一些计算的东西(我在下面复制了一个非常简化的例子),比如 CASE2 并得到了不好的结果。像 CASE1 一样重构代码并且工作正常。我知道 CASE 2 中存在隐式转换,但不确定全部原因。任何人都可以向我解释下面到底发生了什么?

  //CASE 1, result 5.5
    double auxMedia = (5 + 6);
    auxMedia = auxMedia / 2;

    //CASE 2, result 5.0
    double auxMedia1 = (5 + 6) / 2;

    //CASE 3, result 5.5
    double auxMedia3 = (5.0 + 6.0) / 2.0;

    //CASE 4, result 5.5
    double auxMedia4 = (5 + 6) / 2.0;

我的猜测是 CASE2 中的 /2 将 (5 + 6) 转换为 int 并导致除法轮数为 5,然后再次转换为 double 并转换为 5.0。

CASE3 和 CASE 4 也解决了这个问题。

4

4 回答 4

13
  1. 5 + 6 是整数 11;然后你将其转换为双倍(在作业中)并除以二;5.5
  2. 5 + 6 是整数 11;integer 11 / 2 = 5在整数算术下,然后将其转换为 double (在分配中)
  3. 5.0 + 6.0 是双 11.0;除以双 2.0 得到双 5.5
  4. 5 + 6 是整数 11;除法有一个隐式转换为双 11.0,然后除以双 2.0 得到双 5.5
于 2010-03-31T19:00:21.397 回答
5

为了扩展 Marc 的(正确)答案,整数被解释为整数,而带小数点的数字被解释为双精度数。要将整数声明为文字双精度数,请在其上附加“D”:

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;
于 2010-03-31T19:08:06.013 回答
1
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

(5 + 6) 运算的结果是整数。因为两个操作数都是整数类型。然后,编译器执行 11 / 2,其中两个操作数也是整数。最后一个除法的结果显然是5,因为它是整数除法(不知道正确的英文单词)。

于 2010-03-31T19:02:37.710 回答
1

你是对的。CASE 2 使用整数算术直到分配完成。您还可以通过进行显式强制转换来解决问题:

double auxMedia1 = ((double) (5 + 6)) / 2;
于 2010-03-31T19:04:25.880 回答