【问题标题】:Casting to Integer in Java when using type double使用 double 类型时在 Java 中转换为 Integer
【发布时间】:2018-08-19 01:27:49
【问题描述】:

我有这个简单的代码,在得到double 类型的结果之前,我需要了解为什么等式的右边被强制转换为整数。 这里的答案是1.0 所以我不明白为什么不是1.5

int x = 2;
double y = 1 + 1/x;
System.out.println(y);

【问题讨论】:

  • 右侧没有转换为Integer,它已经是一个整数。演员表只发生在等式的最后。我想另一种说法是自动转换中的操作顺序和优先级很重要。所以转换发生在=,而其他操作/+ 具有更高的优先级并先执行,对int 进行操作。
  • 好的,我现在知道了。谢谢。

标签: java integer double


【解决方案1】:

只需按以下方式更新您的代码,因为您正在处理双打。

int x = 2;
double y = 1 + 1.0/x;
System.out.println(y);

【讨论】:

    【解决方案2】:

    注意:双 y = 1 + 1/x;

    修改:double y = 1 + 1.0/x;

    你会得到 1.5

    【讨论】:

      【解决方案3】:

      这里 x 是一个 int,1 也是一个 int,所以计算是在 int 中完成的,所以你得到的答案是 1.0。要获得 1.5,您必须将 1 类型转换为 1.0。然后你会得到 1.5。

      【讨论】:

        【解决方案4】:

        我想你的意思是:为什么右侧的“x”的值没有被“提升”加倍?

        首先,将第二行改为:

        double y = 1 + (double) 1 / x;
        //or
        double y = 1 + 1.0 / x;
        



        详情:

        对于大多数执行算术运算的计算机来说,操作数必须是相同的数据类型。

        强制转换运算符(double)将其操作数显式转换为double,则变量'x'将为隐式转换为双精度,称为promotion

        also 在第二行 1.0 已经是一个浮点 constant 所以你可以猜到这个和之前一样,就是对变量'x'的提升。

        您在您的代码中所做的操作称为整数除法,这意味着除法的小数部分将丢失(截断)。请注意,小数部分在分配给变量 y 之前会丢失。

        您现在可能对我们为什么不这样编写代码有了一些直觉:

        double y = 1.0 +  1 / x;
        

        显然,(1 / x) 仍然是整数除法 ...希望有所帮助!

        【讨论】:

          【解决方案5】:

          就像评论中提到的用户标记空间一样,整数除法发生是因为/ 的优先级高于=,这意味着除法在语句中首先发生。

          double y = 1 + (1/2); // Both 1 and 2 are integers at the time of operation.
          
          // The above equation is the same as
          
          double y = 1 + 0; // 1/2 equals 0 because integer division just keeps the integer value
                            // and gets rid of the value's decimal part.
          

          与其他答案显示的类似,您可以执行以下操作之一:

          double y = 1 + 1.0/x;
          // Or
          double y = 1 + 1/(double)x;
          

          为了简单起见,当我在分配 double 值时使用整数文字时,我只是让所有整数都有 .0 部分。例如,我总是使用1.0 而不是1。这样一来,您就不会因为不需要的整数除法而意外得到意外结果。

          查看this page in the Java doc,了解 Java 中运算符的优先顺序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-19
            • 2013-10-07
            • 1970-01-01
            • 1970-01-01
            • 2010-11-20
            • 1970-01-01
            • 2023-03-28
            • 1970-01-01
            相关资源
            最近更新 更多