Как преобразовать целое число в число с плавающей запятой в Java?


82

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


8
float result = ((float) x) / y?
mibollma 07

проверьте это: xahlee.org/java-a-day/casting.html
fasseg


1
@VinAy: Я бы не рекомендовал это в данном случае. BigDecimalне является универсально правильной заменой float.
Мэтт Болл,

1
@VinAy: Это полностью зависит от цели. Если он занимается финансами, вы правы. Если он вычисляет траектории астероидов, вы этого не делаете.
user207421 07

Ответы:


153

Вам просто нужно привести хотя бы один из операндов к float:

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 и более случаях. Это даже отдаленно не будет узким местом. Если вы действительно так обеспокоены, протестируйте его самостоятельно.
Мэтт Болл,

1
Первый и второй вызовут ошибки на определенных устройствах arm, убедитесь, что вы указали оба целых числа.
Оливер Диксон,

java.lang.Integer не может быть преобразован в java.lang.Float
asp

2
@ user3002853 читал о коробочных типах и примитивах. docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Мэтт Болл

5

Вы не должны использовать float без необходимости. В 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.

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

В этом случае int x имеет 32-битную точность, тогда как float имеет 24-битную точность, даже деление на 1 может иметь ошибку округления. double, с другой стороны, имеет 53-битную точность, чего более чем достаточно для получения достаточно точного результата.


6
Вы должны уточнить, почему double лучше чем float.
Мэтт Болл


4

// Целое число, которое я хочу преобразовать

int myInt = 100;

// Приведение целого числа к float

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Для этого совершенно не нужно использовать обертку type ( ).
Мэтт Болл,

1
Пожалуйста , не используйте подписи или слоганы в своих сообщениях.
meagar

1

Самир:

float l = new Float(x/y)

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

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

Семантически лучший кандидат.


Ваш ответ должен был быть комментарием. Самир не получит уведомления о вашем сообщении. Семантически преобразовывать оба целых числа в число с плавающей запятой перед вычислением результата излишне - поэтому это не лучше, чем преобразование только одного. Это производит неправильное впечатление и, следовательно, неполноценно, imho.
user unknown
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.