Преобразование 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 ️. В вашем распоряжении есть инструменты для трансформации:
- Свиток Приведения Типов : int value = (int) doubleValue;
- Волшебная Палочка Округления Вниз : int value = (int) Math.floor(doubleValue);
- Перо Округления Вверх ️: int value = (int) Math.ceil(doubleValue);
- Часы Круглого Округления ⏰: int value = Math.round(doubleValue);
Все они перенесут вас в различные области целых чисел:
: 24 (округление вниз) : 24 (округление вниз) ️: 25 (округление вверх) ⏰: 25 (округление до ближайшего целого)
Выбирайте инструмент в зависимости от цели преобразования! ♀️
Полезные материалы
- Примитивные типы данных в Java — обзор примитивных типов данных в Java.
- Преобразование типов в Java с примерами – GeeksforGeeks — примеры преобразования типов.
- Integer (Java Platform SE 7 ) — детальная информация о методе parseInt() .
- Безопасное приведение long к int в Java – Stack Overflow — дискуссии об особенностях преобразования типов.
- Effective Java, 3-е издание — Практическое руководство по Java от Джошуа Блоха.
- Глава 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.
Явные и неявные преобразования
Когда в одной операции вовлечены данные разных типов, не всегда необходимо использовать операцию преобразования типов. Некоторые виды преобразований выполняются неявно, автоматически.
Автоматические преобразования
Стрелками на рисунке показано, какие преобразования типов могут выполняться автоматически. Пунктирными стрелками показаны автоматические преобразования с потерей точности.
Автоматически без каких-либо проблем производятся расширяющие преобразования (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 — классическое округление
Ссылка на документацию >>>