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

Как выполнить двойную работу в Java?

Я новичок в Java и задаюсь вопросом, как делать двойную работу? Я понимаю, что он довольно прост для int, беря низкие 32 бита, но как насчет двойных (64 бит) до int (32 бита)? эти 64 бита из двоичного двоичного файла в формате с плавающей запятой с двойной точностью (Mantissa), поэтому как он преобразуется в int внутри?

4b9b3361

Ответ 1

Все это описано в раздел 5.1.3 JLS.

На первом этапе число с плавающей запятой преобразуется либо в long, если T long, либо в int, если T является байтом, коротким, char или int следующим образом:

Если число с плавающей запятой является NaN (п. 4.2.3), результатом первого шага преобразования является int или long 0.

  • В противном случае, если число с плавающей запятой не является бесконечностью, значение с плавающей запятой округляется до целочисленного значения V, округляя к нулю с использованием режима округления к нулю (IEEE 754) (§4.2.3), Тогда есть два случая:

    • Если T длинно, и это целочисленное значение может быть представлено как длинное, то результатом первого шага является длинное значение V.

    • В противном случае, если это целочисленное значение может быть представлено как int, то результатом первого шага является значение int V.

  • В противном случае должен выполняться один из следующих двух случаев:

    • Значение должно быть слишком маленьким (отрицательное значение большой величины или отрицательной бесконечности), а результат первого шага - наименьшее представимое значение типа int или long.

    • Значение должно быть слишком большим (положительное значение большой величины или положительной бесконечности), а результатом первого шага является наибольшее представимое значение типа int или long.

(Второй шаг здесь не имеет значения, когда T есть int.)

В большинстве случаев я ожидаю, что это будет реализовано с помощью аппаратной поддержки. Преобразование чисел с плавающей точкой в ​​целые числа - это то, что обычно обрабатывается процессорами.

Ответ 2

Java усекает свое значение, если вы используете (int) cast, как вы можете заметить:

    double d = 2.4d;
    int i = (int) d;
    System.out.println(i);
    d = 2.6;
    i = (int) d;
    System.out.println(i);

Вывод:

2
2

Если вы не используете Math.round, Math.ceil, Math.floor...