了解Java中的Casting

时间:2011-07-04 11:32:46

标签: java casting floating-point double precision

这是我在这里发表的第一篇文章,我要感谢能够帮助我解决这个简单问题的所有人:如何在java中进行投射?

我做了这个非常简单的课程:

public class test {
    public static void main ( String[] args )
    {
        System.out.println((short)(1/3));
        System.out.println((int)(1/3));
        System.out.println((float)(1/3));
        System.out.println((double)(1/3));
    }
}

这个软件在执行时给我这个输出(linux下32位机器上的官方JDK 6 u26)

0
0
0.0
0.0

问题,或者我不理解的事情,如果你愿意的话,最后2个结果是0.0,我期待的是0.3333333,但显然演员以另一种方式工作:如何?

感谢

PS 我对英语不太熟悉,如果我犯了一些错误,我为此道歉

6 个答案:

答案 0 :(得分:9)

首先,执行表达式1/3。该表达意味着“1乘3的整数除法”。它的结果是整数0。然后将此结果(0)强制转换为double(或float)。当然,它会导致0.0

您必须将该分区的一个操作数强制转换为double(或float),以将其转换为双分割:

double d = ((double) 1) / 3;

或简单地写

1.0 / 3

答案 1 :(得分:5)

如果对整数值使用运算符/,则结果将输入为整数。

您必须强制将1或3强制为浮点值 - 尝试编写1.0/3而不是1/3

答案 2 :(得分:4)

在最后两种情况下,你首先计算1/3,即0.然后你将它投射到一个浮点数/双精度数。 使用:

((float)1)/3

答案 3 :(得分:1)

int转换为double。

(1/3)的类型为int,因此answer为0。

现在0被转换为double或float,因此它变为0.0

答案 4 :(得分:1)

你需要施放操作数,而不是结果。这将产生您期望的输出:

System.out.println(((short) 1 / (short) 3));
System.out.println((1 / 3));
System.out.println(((float) 1 / (float) 3));
System.out.println(((double) 1 / (double) 3));

答案 5 :(得分:1)

因为括号中有1/3,所以它使用整数除法然后转换为指定的类型。如果您使用1.0 / 3.0或(浮点)1/3,它将评估为.3333333。 1和3是整数文字,因此除法的结果将被截断。要使用float和double literals,请将f或d放在数字的末尾(1.0f,1.0d)。转换会影响它之后的值,因此如果您的值在括号中,它将评估该值,然后进行转换。