Как конвертировать float в int с помощью Java


342

Я использовал следующую строку для преобразования float в int, но это не так точно, как хотелось бы:

 float a=8.61f;
 int b;

 b=(int)a;

Результат: 8(должно быть 9)

Когда a = -7.65f, результат: -7(должно быть -8)

Какой лучший способ сделать это?


16
Я должен отметить, что просто приведение типов усекает значение и не выполняет каких-либо операций округления / выравнивания над значением.
Брайан Грэм

Ответы:


678

Использование Math.round()округляет число с плавающей точкой до ближайшего целого числа.


1
зачем нужен тип-тип после Math.round ()?
Некромант

81
Math.round()возвращает intзначение, так что использование типов при добавлении (int)является избыточным.
Solvek

5
использовать или / или ... (int)fooпроще.
Юттадхаммо

31
Ответ Солвека верен, но я хотел бы отметить, что Math.round () может иметь два разных типа вывода на основе ввода. Math.round (double a) возвращает long. Math.round (float a) возвращает int. docs.oracle.com/javase/7/docs/api/java/lang/…
Хососуги

2
Math.round () - медленная операция по сравнению с приведением к (int)
darkgaze

186

На самом деле, есть разные способы понизить значение float до int, в зависимости от того, какого результата вы хотите достичь: (для int i, float f)

  • round (ближайшее целое число к заданному float)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3
    

    примечание: по договору это равно (int) Math.floor(f + 0.5f)

  • усечь (т.е. отбросить все после десятичной точки)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
  • ceil / floor (целое число всегда больше / меньше заданного значения, если оно имеет дробную часть)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3
    

Для округления положительных значений вы также можете просто использовать (int)(f + 0.5), что работает точно так же, как Math.Roundв тех случаях (согласно документу).

Вы также можете использовать Math.rint(f)для округления до ближайшего четного числа ; возможно, это полезно, если вы планируете иметь дело с большим количеством операций с дробной частью, строго равной .5 (обратите внимание на возможные проблемы округления IEEE), и хотите сохранить среднее значение набора на месте; Вы будете вводить другое смещение, где четные числа будут более распространенными, чем нечетные.

Видеть

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

для получения дополнительной информации и некоторых примеров.


rint - банковское округление; это помогает уменьшить количество ошибок, которые могут появиться, если вы постоянно округляете 0,5 вверх или вниз.
Просфилаес

@prosfilaes Я изменил формулировку и добавил ссылку вики на эту часть ответа.


6

Math.round также возвращает целочисленное значение, поэтому вам не нужно типизировать.

int b = Math.round(float a);

14
Другие ответы уже говорят это. Пожалуйста, добавляйте новый ответ, только если у вас есть что добавить. (Кроме того, Math.round не возвращает int.)
Джеффри Босбум

1
Он даёт объяснения о том, что нет необходимости в типизировании (ответ Sachithra). Но это может быть преобразовано как комментарий.
Ранджит Кумар

5

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

float a = 8.61f;
int b = (int)Math.round(a);

Math.round (float) возвращает int, я не уверен, почему приведение к int необходимо
Nephilim

-1

Как по мне, проще: (int) (a +.5) // a это Float. Вернуть округленное значение.

Не зависит от типов Java Math.round ()


4
Это смущает многих разработчиков, которые анализируют код. Не будет ясно, что это округление.
ivan.panasiuk

1
Конечно, это просто базовая математика, просто попробуйте
Bruno L.

4
«Базовая математика» - это относительный термин. :) По своему опыту могу поспорить, что более 50% разработчиков не поймут, что это действительно округление. Это математически правильно, но, как я написал, это не ясно, и другим трудно понять, что делает код.
ivan.panasiuk

2
-(int) ( PI / 3 ): попробуйте свой код с отрицательным a... с каких пор -0.5округляет до 0?

вы правы, если число отрицательное, вы должны добавить -0,5 вместо
Бруно Л.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.