преобразование двойного в целое число в Java

114

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

double x = 1.5;
int y = (int)x;

вы получите y = 1. Если вы сделаете это:

int y = (int)Math.round(x);

Скорее всего, вы получите 2. Однако мне интересно: поскольку двойные представления целых чисел иногда выглядят как 1.9999999998 или что-то в этом роде, существует ли вероятность того, что приведение двойника, созданного с помощью Math.round (), все равно приведет к сокращенному числу, скорее чем округленное число, которое мы ищем (например: 1 вместо 2 в представленном коде)?

(и да, я имею в виду именно это: есть ли какое- либо значение для x, где y покажет результат, который является усеченным, а не округленным представлением x?)

Если да: есть ли лучший способ превратить double в округленное целое число без риска усечения?


Прикинул что-то: Math.round (x) возвращает длинный, а не двойной. Следовательно: Math.round () не может вернуть число вида 3.9999998. Следовательно, int (Math.round ()) никогда не потребуется что-либо усекать, и он всегда будет работать.

vdMandele
источник
6
Math.round (double) возвращает long, а не double.
qbert220

Ответы:

95

есть ли вероятность, что приведение двойника, созданного через, Math.round()все равно приведет к усеченному числу

Нет, round()ваш double всегда будет округляться до правильного значения, а затем он будет преобразован в, longкоторый будет усекать любые десятичные знаки. Но после округления дробных частей не останется.

Вот документы от Math.round(double):

Возвращает ближайшее к аргументу значение long. Результат округляется до целого числа путем добавления 1/2, взятия минимального значения результата и приведения результата к типу long. Другими словами, результат равен значению выражения:

(long)Math.floor(a + 0.5d)
jjnguy
источник
3
Важным моментом является то, что округление выполняется методом round. Возвращается длинное значение, которое можно безопасно преобразовать в int (при условии, что возвращаемое значение всегда будет в диапазоне int).
qbert220
Да. Не могу представить, что / long / для int дает проблемы. Очевидно! Должен был догадаться :(
vdMandele
1
Хотя это правда, что усечение не произойдет из-за округления, вы все равно можете не получить ожидаемых результатов просто из-за преобразования из double, которое является очень большим числом, [max double: 1.7976931348623157E308]в int, которое намного меньше [max int: 2147483647]. Просто нужно иметь в виду.
Nelda.techspiress
22

Для типа данных Doubleк int, вы можете использовать следующее:

Double double = 5.00;

int integer = double.intValue();
Чарли
источник
Он ищет округленное значение.
Marquis of Lorne
1
Я не думаю, что это даст то, что вы ожидаете от 4,99999999999 (даст 4, а не 5)
murkle
12
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Решил мою цель.

Нандкишор Гохе
источник