将等于整数的double总是强制转换为该整数(假设double不是导致溢出的那个)。示例:Math.ceil()将返回等于整数的double。假设没有溢出,它总是会转换为相应的整数吗?
如果没有,我如何将double
汇总到int
或long
?
答案 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
}
}
}