Как double преобразовать в int java
Перейти к содержимому

Как double преобразовать в int java

  • автор:

Преобразование double в int в Java: округление без усечения

Для преобразования значения типа double в int в Java следует применить явное приведение типа. Поместите переменную double в круглые скобки предварительно указав (int) перед ней:

Скопировать код

int myInt = (int) 9.7; // В результате получим 9

Если необходимо округлить число до ближайшего целого, используйте метод Math.round :

Скопировать код

int myInt = (int) Math.round(9.7); // В результате получим 10

Если требуется округлить double до ближайшего целого числа перед тем как конвертировать его в int , примените метод Math.round() . Этот подход поможет избежать потери дробной части:

Скопировать код

double myDouble = 9.7; long rounded = Math.round(myDouble); // Округляем до 10 int myInt = (int) rounded; // Приведение из long в int

Прямое преобразование объекта класса Double в int возможно с использованием метода .intValue() :

Скопировать код

Double doubleObject = 9.7; int myInt = doubleObject.intValue(); // В результате получим 9

Итегральные знания: округление, отсечение, приведение типа

Аспекты округления

Метод, используемый для округления, имеет свои особенности. В Java различают следующие методы округления:

  • Math.round(): классическое округление в соответствии с правилами арифметики.
  • Math.ceil(): округление к большему значению.
  • Math.floor(): округление к меньшему значению.

Проблемы приведения double к int

Приведение double к int может вызвать проблемы если вещественное число выходит за пределы диапазона целочисленных значений. Будьте осторожны, если число приближается к Integer.MAX_VALUE или Integer.MIN_VALUE .

Особые случаи

В Java реализовано специальное поведение для отдельных значений:

  • Приведение NaN к int вернет 0 .
  • Приведение положительной бесконечности вернет значение Integer.MAX_VALUE .
  • Приведение отрицательной бесконечности вернет значение Integer.MIN_VALUE .

Преобразование double в int: лучшие практики индустрии

Важность точности значений

Точность играет решающую роль в критическое областях, таких как финансовые вычисления. В таких случаях используйте другие альтернативы, например класс BigDecimal , с целью предотвращения ошибок при работе с числами с плавающей точкой и для более точной настройки численных значений.

Преобразование с учетом контекста

В больших организациях контроль за вводимыми данными и обработка исключительных случаев являются ключевыми факторами. Понимание информационных потоков и требования к точности в контексте текущих задач помогут вам выбрать правильный метод преобразования.

Визуализация

Представьте, что вы находитесь в волшебном Замке Преобразования из Double в Int ��, и у вас в руках double значение 24.7 ��️��. В вашем распоряжении есть инструменты для трансформации:

  1. Свиток Приведения Типов ��: int value = (int) doubleValue;
  2. Волшебная Палочка Округления Вниз ��: int value = (int) Math.floor(doubleValue);
  3. Перо Округления Вверх ��️: int value = (int) Math.ceil(doubleValue);
  4. Часы Круглого Округления ⏰: int value = Math.round(doubleValue);

Все они перенесут вас в различные области целых чисел:

��: 24 (округление вниз) ��: 24 (округление вниз) ��️: 25 (округление вверх) ⏰: 25 (округление до ближайшего целого)

Выбирайте инструмент в зависимости от цели преобразования! ��‍♀️

Полезные материалы

  1. Примитивные типы данных в Java — обзор примитивных типов данных в Java.
  2. Преобразование типов в Java с примерами – GeeksforGeeks — примеры преобразования типов.
  3. Integer (Java Platform SE 7 ) — детальная информация о методе parseInt() .
  4. Безопасное приведение long к int в Java – Stack Overflow — дискуссии об особенностях преобразования типов.
  5. Effective Java, 3-е издание — Практическое руководство по Java от Джошуа Блоха.
  6. Глава 5. Преобразования и контексты — детали преобразования типов согласно Спецификации языка Java.

Как double преобразовать в int java

Каждый базовый тип данных занимает определенное количество байт памяти. Это накладывает ограничение на операции, в которые вовлечены различные типы данных. Рассмотрим следующий пример:

int a = 4; byte b = a; // ! Ошибка

В данном коде мы столкнемся с ошибкой. Хотя и тип byte, и тип int представляют целые числа. Более того, значение переменной a, которое присваивается переменной типа byte, вполне укладывается в диапазон значений для типа byte (от -128 до 127). Тем не менее мы сталкиваемся с ошибкой на этапе компиляции. Поскольку в данном случае мы пытаемся присвоить некоторые данные, которые занимают 4 байта, переменной, которая занимает всего один байт.

Тем не менее в программе может потребоваться, чтобы подобное преобразование было выполнено. В этом случае необходимо использовать операцию преобразования типов (операция () ):

int a = 4; byte b = (byte)a; // преобразование типов: от типа int к типу byte System.out.println(b); // 4

Операция преобразования типов предполагает указание в скобках того типа, к которому надо преобразовать значение. Например, в случае операции (byte)a , идет преобразование данных типа int в тип byte. В итоге мы получим значение типа byte.

Явные и неявные преобразования

Когда в одной операции вовлечены данные разных типов, не всегда необходимо использовать операцию преобразования типов. Некоторые виды преобразований выполняются неявно, автоматически.

Автоматические преобразования

Преобразования типов в языке Java

Стрелками на рисунке показано, какие преобразования типов могут выполняться автоматически. Пунктирными стрелками показаны автоматические преобразования с потерей точности.

Автоматически без каких-либо проблем производятся расширяющие преобразования (widening) — они расширяют представление объекта в памяти. Например:

byte b = 7; int d = b; // преобразование от byte к int

В данном случае значение типа byte, которое занимает в памяти 1 байт, расширяется до типа int, которое занимает 4 байта.

Расширяющие автоматические преобразования представлены следующими цепочками:

byte -> short -> int -> long

short -> float -> double

Автоматические преобразования с потерей точности

Некоторые преобразования могут производиться автоматически между типами данных одинаковой разрядности или даже от типа данных с большей разрядностью к типа с меньшей разрядностью. Это следующие цепочки преобразований: int -> float , long -> float и long -> double . Они производятся без ошибок, но при преобразовании мы можем столкнуться с потерей информации.

int a = 2147483647; float b = a; // от типа int к типу float System.out.println(b); // 2.14748365E9
Явные преобразования

Во всех остальных преобразованиях примитивных типов явным образом применяется операция преобразования типов. Обычно это сужающие преобразования (narrowing) от типа с большей разрядностью к типу с меньшей разрядностью:

long a = 4; int b = (int) a;

Потеря данных при преобразовании

При применении явных преобразований мы можем столкнуться с потерей данных. Например, в следующем коде у нас не возникнет никаких проблем:

int a = 5; byte b = (byte) a; System.out.println(b); // 5

Число 5 вполне укладывается в диапазон значений типа byte, поэтому после преобразования переменная b будет равна 5. Но что будет в следующем случае:

int a = 258; byte b = (byte) a; System.out.println(b); // 2

Результатом будет число 2. В данном случае число 258 вне диапазона для типа byte (от -128 до 127), поэтому произойдет усечение значения. Почему результатом будет именно число 2?

Число a, которое равно 258, в двоичном системе будет равно 00000000 00000000 00000001 00000010 . Значения типа byte занимают в памяти только 8 бит. Поэтому двоичное представление числа int усекается до 8 правых разрядов, то есть 00000010 , что в десятичной системе дает число 2.

Усечение рациональных чисел до целых

При преобразовании значений с плавающей точкой к целочисленным значениям, происходит усечение дробной части:

double a = 56.9898; int b = (int)a;

Здесь значение числа b будет равно 56, несмотря на то, что число 57 было бы ближе к 56.9898. Чтобы избежать подобных казусов, надо применять функцию округления, которая есть в математической библиотеке Java:

double a = 56.9898; int b = (int)Math.round(a);

Преобразования при операциях

Нередки ситуации, когда приходится применять различные операции, например, сложение и произведение, над значениями разных типов. Здесь также действуют некоторые правила:

  • если один из операндов операции относится к типу double , то и второй операнд преобразуется к типу double
  • если предыдущее условие не соблюдено, а один из операндов операции относится к типу float , то и второй операнд преобразуется к типу float
  • если предыдущие условия не соблюдены, один из операндов операции относится к типу long , то и второй операнд преобразуется к типу long
  • иначе все операнды операции преобразуются к типу int
int a = 3; double b = 4.6; double c = a+b;

Так как в операции участвует значение типа double, то и другое значение приводится к типу double и сумма двух значений a+b будет представлять тип double.

byte a = 3; short b = 4; byte c = (byte)(a+b);

Две переменных типа byte и short (не double, float или long), поэтому при сложении они преобразуются к типу int , и их сумма a+b представляет значение типа int. Поэтому если затем мы присваиваем эту сумму переменной типа byte, то нам опять надо сделать преобразование типов к byte.

Если в операциях участвуют данные типа char, то они преобразуются в int:

int d = 'a' + 5; System.out.println(d); // 102

Как перевести double в int java

Для перевода значения типа double в значение типа int в Java можно воспользоваться явным приведением типов. Это позволяет преобразовать значение одного типа данных в значение другого типа данных. Вот пример кода:

double myDouble = 3.14; int myInt = (int) myDouble; System.out.println(myInt); // => 3 

Здесь значение переменной myDouble явно приводится к типу int с помощью оператора (int) . Значение переменной myDouble теряет дробную часть и преобразуется в целочисленное значение, которое сохраняется в переменную myInt .

Конвертировать double в int

Но тут, есть подводные камни, а именно — тип int содержит значения в диапазоне от -2147483648 до 2147483647 , притом что они являются целочисленные, т.е. без дробной части. А double содержит числа в диапазоне от 4.9E-324 до 4.9E-324 . Т.е. при конвертации может произойти переполнение и/или не учитывание дробной части.

Для более гибкого преобразования стоит использовать классы BigDecimal и BigInteger .

Отслеживать
ответ дан 29 янв 2017 в 17:20
15k 1 1 золотой знак 22 22 серебряных знака 41 41 бронзовый знак

Если нужно округлять вверх или вниз, используйте Math.round()

double a = 1.8; int b = Math.round(a); // b = 2 

Отслеживать
ответ дан 29 янв 2017 в 17:21
Кирилл Малышев Кирилл Малышев
10.8k 1 1 золотой знак 19 19 серебряных знаков 34 34 бронзовых знака

Double mDouble = 0.25; int mInt = (int)mDouble; 

Отслеживать
ответ дан 29 янв 2017 в 17:14
172 11 11 бронзовых знаков

Округляем в нужную сторону.

 double dx = 10.787901; double newDouble2 = new BigDecimal(dx).setScale(3, RoundingMode.HALF_EVEN).doubleValue(); int ix = (int)newDouble2; // переводим в int 

UP — округление в сторону большего числа для положительных чисел и меньшего для отрицательных.
DOWN — округление в сторону меньшего числа для положительных чисел и большего для отрицательных.
CEILING — округление в сторону большего и для положительных, и для отрицательных чисел.
FLOOR — округление в сторону меньшего и для положительных, и для отрицательных чисел.
HALF_UP — округление в большую сторону в случае числа вида 0.5
HALF_DOWN — округление в меньшую сторону в случае числа вида 0.5
HALF_EVEN — классическое округление

Ссылка на документацию >>>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *