Ответ 1
Так как типы Java фиксированы, а Java удваивает 52-битную мантиссу, они могут (с легкостью) представлять 32-битный Java int без округления.
Будет ли двойной, равный целому числу, всегда отбрасываться на это целое число (при условии, что double не является тем, что вызывает переполнение). Пример: Math.ceil() вернет двойное число, равное целому числу. Предполагая, что нет переполнения, всегда ли он будет отбрасываться до того же целого числа, что он предположительно равен?
Если нет, как я могу округлить double
до int
или long
?
Так как типы Java фиксированы, а Java удваивает 52-битную мантиссу, они могут (с легкостью) представлять 32-битный Java int без округления.
Да, он точно преобразуется. Это описано в Раздел 5.1.3 JLS, в котором упоминается
В противном случае, если число с плавающей запятой не является бесконечностью, значение с плавающей запятой округляется до целочисленного значения V, округляя к ноль с использованием режима IEEE 754 round-to-zero...
Так как ваш 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");
}
Все возможные значения int
могут быть представлены двойным без ошибок. Самый простой способ округления - использовать Math.ceil(), например.
double d =
long l = (long) Math.ceil(d); // note: could overflow.
Эмпирически, ответ кажется да - обратите внимание, что он также работает с 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
}
}
}