перетворення подвійного в ціле число в 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?)

Якщо так: чи є кращий спосіб перетворити дубль в закруглений int, не ризикуючи усіканням?


Щось зрозуміло: Math.round (x) повертає довге, а не подвійне. Отже: Math.round () не може повернути число, схоже на 3.9999998. Тому int (Math.round ()) ніколи нічого не потрібно буде усікати і завжди працюватиме.


6
Math.round (подвійний) повертає довге, а не подвійне.
qbert220

Відповіді:


95

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

Ні, round()завжди буде округлювати ваш подвійний до правильного значення, і тоді він буде переданий до longчисла, яке буде усікати будь-які десяткові знаки. Але після округлення не залишиться жодної дробової частини.

Ось документи з Math.round(double):

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

(long)Math.floor(a + 0.5d)

3
Важливим моментом є те, що округлення проводиться в межах методу круглої форми. Повертається довге значення, яке може бути безпечно передано до int (якщо вважати, що повернене значення завжди буде в межах int).
qbert220

Так. Не можу уявити / long / to int проблеми. Очевидно! Потрібно було
зрозуміти

1
Хоча це правда, що укорочення не відбудеться через округлення, ви все одно не зможете отримати очікувані результати просто за рахунок лиття з подвійного, що є дуже великим числом [max double: 1.7976931348623157E308]до int, що набагато набагато менше [max int: 2147483647]. Просто щось пам’ятати.
Nelda.techspiress

22

Для типу даних Doubleдо int, ви можете використовувати наступне:

Double double = 5.00;

int integer = double.intValue();

Він шукає округлене значення.
Маркіз Лорнський

1
Я не думаю, що це дасть те, що ви очікуєте на 4.99999999999 (дасть 4, а не 5)
murkle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.