如果一个双精度浮点数等于一个整数,那么它是否总是可以转换为该整数呢?(假设该双精度浮点数不会导致溢出)。例如:Math.ceil() 将返回一个等于整数的双精度浮点数。假设没有发生溢出,那么它总是可以转换为与其相等的整数吗?
如果不能,那么如何将一个double
四舍五入为一个int
或long
?
如果一个双精度浮点数等于一个整数,那么它是否总是可以转换为该整数呢?(假设该双精度浮点数不会导致溢出)。例如:Math.ceil() 将返回一个等于整数的双精度浮点数。假设没有发生溢出,那么它总是可以转换为与其相等的整数吗?
如果不能,那么如何将一个double
四舍五入为一个int
或long
?
由于Java类型是固定的且Java双精度浮点数具有52位尾数,因此它们可以轻松地表示32位Java int而不需要四舍五入。
是的,它将完全转换。这在JLS的第5.1.3节中有所描述,其中提到:
否则,如果浮点数不是无穷大,则使用IEEE 754朝零舍入模式将浮点值四舍五入为整数值V...
由于您的double
恰好等于int
,因此“四舍五入”值就是完全相同的值,但您可以阅读规范以获取详细信息。
我相信是这样的,但你可以自己测试一下:
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");
}
double d =
long l = (long) Math.ceil(d); // note: could overflow.
int
值都可以,但不是所有的 long
值都可以。 - Oliver Charlesworthi2 = (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
}
}
}