Подтвердить что ты не робот

Будет ли двойной, равный целому числу, всегда отбрасываться на это целое число?

Будет ли двойной, равный целому числу, всегда отбрасываться на это целое число (при условии, что double не является тем, что вызывает переполнение). Пример: Math.ceil() вернет двойное число, равное целому числу. Предполагая, что нет переполнения, всегда ли он будет отбрасываться до того же целого числа, что он предположительно равен?

Если нет, как я могу округлить double до int или long?

4b9b3361

Ответ 2

Да, он точно преобразуется. Это описано в Раздел 5.1.3 JLS, в котором упоминается

В противном случае, если число с плавающей запятой не является бесконечностью, значение с плавающей запятой округляется до целочисленного значения V, округляя к ноль с использованием режима IEEE 754 round-to-zero...

Так как ваш double в точности равен int, "округленное" значение является точно таким же значением, но вы можете прочитать спецификацию для деталей.

Ответ 3

Я так считаю, но вы можете проверить его сами:

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");
}

Ответ 4

Все возможные значения int могут быть представлены двойным без ошибок. Самый простой способ округления - использовать Math.ceil(), например.

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

Ответ 5

Эмпирически, ответ кажется да - обратите внимание, что он также работает с 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
        }
    }
}