Як перетворити ціле число на плаваюче в Java?


82

У мене є два цілих числа xі y. Мені потрібно розрахувати, x/yі як результат я хотів би отримати плаваючу позицію. Наприклад, як результат 3/2я хотів би мати 1,5. Я думав , що найпростіший (або єдиний) спосіб зробити це , щоб перетворити xі yв тип з плаваючою точкою. На жаль, я не можу знайти простий спосіб це зробити. Не могли б ви допомогти мені в цьому?


8
плаваючий результат = ((плаваючий) x) / y?
mibollma

перевірте це: xahlee.org/java-a-day/casting.html
fasseg

2
можливий дублікат Java: поділ 2 ints робить int?
dogbane

1
@VinAy: Я б не рекомендував цього в цьому випадку. BigDecimalне є універсально правильною заміною для float.
Matt Ball

1
@VinAy: Це повністю залежить, яка мета. Якщо він займається фінансами, ви маєте рацію. Якщо він обчислює траєкторії астероїдів, ви ні.
user207421

Відповіді:


153

Вам просто потрібно кинути принаймні один з операндів на поплавок:

float z = (float) x / y;

або

float z = x / (float) y;

або (непотрібно)

float z = (float) x / (float) y;

Чи це ефективніше, ніж: float z = (1,0 * x) / y; ? Чи перетворення плаваючої функції внутрішньо ефективніше множення? Tnx!
MSquare

1
Не знаю, але я думаю, що це неактуально 99% і більше випадків. Це навіть віддалено не буде вузьким місцем. Якщо вас справді це турбує, порівняйте це самі.
Matt Ball

1
Перше та друге спричинять помилки на певних пристроях для плечей. Переконайтеся, що ви відтворили обидва цілих числа.
Олівер Діксон,

java.lang.Integer не можна передати на java.lang.Float
asp

2
@ user3002853 читайте про типи в коробці та примітиви. docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Метт Болл

5

Ви не повинні використовувати флоат, якщо вам не потрібно. У 99% випадків подвійний - кращий вибір.

int x = 1111111111;
int y = 10000;
float f = (float) x / y;
double d = (double) x / y;
System.out.println("f= "+f);
System.out.println("d= "+d);

відбитки

f= 111111.12
d= 111111.1111

Після коментаря @ Matt.

float має дуже невелику точність (6-7 цифр) і досить легко демонструє значну помилку округлення. double має ще 9 цифр точності. Вартість використання double замість float є умовною у 99% випадків, однак вартість тонкої помилки через помилку округлення набагато вища. З цієї причини багато розробників рекомендують взагалі не використовувати плаваючу крапку і настійно рекомендують BigDecimal.

Однак я вважаю, що в більшості випадків можна використовувати подвійне, якщо використовується розумне округлення .

У цьому випадку int x має 32-бітну точність, тоді як float має 24-бітну точність, навіть ділення на 1 може мати помилку округлення. double, з іншого боку, має 53-бітну точність, що більш ніж достатньо для отримання досить точного результату.


6
Вам слід детальніше пояснити, чому double це краще, ніж float.
Matt Ball


4

// Ціле число, яке я хочу перетворити

int myInt = 100;

// Відлиття цілого числа з плаваючим числом

float newFloat = (float) myInt

1
принаймні в Android Studio, компілятор скаржиться на несумісні типи, намагаючись це зробити.
Адам Р. Тернер

3

Ось як це можна зробити:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int x = 3;
    int y = 2;
    Float fX = new Float(x);
    float res = fX.floatValue()/y;
    System.out.println("res = "+res);
}

Побачимось !


7
Використання обгортки типу ( Float) для цього абсолютно непотрібне.
Matt Ball

1
Будь ласка , не використовуйте підписи чи слогани у своїх публікаціях.
мегагар

1

Самер:

float l = new Float(x/y)

не буде працювати, оскільки спочатку буде обчислювати ціле ділення x та y, а потім побудувати з нього float.

float result = (float) x / (float) y;

Семантично найкращий кандидат.


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