将等于整数的double总是强制转换为该整数吗?

时间:2012-02-17 09:48:18

标签: java casting double

将等于整数的double总是强制转换为该整数(假设double不是导致溢出的那个)。示例:Math.ceil()将返回等于整数的double。假设没有溢出,它总是会转换为相应的整数吗?

如果没有,我如何将double汇总到intlong

5 个答案:

答案 0 :(得分:9)

由于Java类型是固定的并且Java doubles have a 52 bit mantissa,它们可以(轻松地)代表32位Java int而不进行舍入。

答案 1 :(得分:6)

是的,它会完全转换。这在JLS的Section 5.1.3中有描述,其中提到了

  

否则,如果浮点数不是无穷大,则   浮点值四舍五入为整数值V,向四舍五入   零使用IEEE 754舍入零模式...

由于您的double完全等于int,因此“舍入”值只是完全相同的值,但您可以阅读规范以获取详细信息。

答案 2 :(得分:1)

我相信,但你可以自己测试一下:

public static void main(String... args) throws Exception {
    int interactions = Integer.MAX_VALUE;
    int i = Integer.MIN_VALUE;
    double d = Integer.MIN_VALUE;
    long init = System.currentTimeMillis();
    for (; i < interactions; i++, d++)
        if (!(i == (int) Math.ceil(d)))
            throw new Exception("something went wrong with i=" + i + " and d=" + d + ", Math.ceil(d)="+Math.ceil(d));

    System.out.println("Finished in: "+(System.currentTimeMillis() - init)+"ms");
}

答案 3 :(得分:1)

所有可能的int值都可以用双精度表示而不会出错。最简单的方法是使用Math.ceil(),例如

double d = 
long l = (long) Math.ceil(d); // note: could overflow.

答案 4 :(得分:1)

根据经验,答案似乎是肯定的 - 请注意它也适用于i2 = (int) d;

public static void main(String[] args) {
    for (int i = Integer.MIN_VALUE + 1; i < Integer.MAX_VALUE; i++) {
        double d = i;
        int i2 = (int) Math.ceil(d);
        if (i != i2) {
            System.out.println("i=" + i + " and i2=" + i2); //Never executed
        }
    }
}
相关问题