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

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

 float a=8.61f;
 int b;

 b=(int)a;

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

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

Как лучше всего это сделать?


person Frank    schedule 18.08.2009    source источник
comment
Я должен отметить, что простое приведение типов обрезает значение и не выполняет никаких операций округления / округления для значения.   -  person Brian Graham    schedule 19.03.2012


Ответы (9)


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

person tw39124    schedule 18.08.2009
comment
почему требуется приведение типов после Math.round ()? - person necromancer; 09.06.2012
comment
Math.round() возвращает значение int, поэтому приведение типов с использованием (int) является избыточным. - person Solvek; 02.07.2012
comment
используйте либо /, либо ... (int)foo проще. - person yuttadhammo; 12.07.2012
comment
Ответ Solvek правильный, но я хотел бы отметить, что Math.round () может иметь два разных типа вывода в зависимости от ввода. Math.round (double a) возвращает long. Math.round (float a) возвращает int. docs.oracle.com/javase / 7 / docs / api / java / lang / - person Hososugi; 13.03.2014
comment
Math.round () - медленная операция по сравнению с приведением к (int) - person Darkgaze; 15.11.2016
comment
@darkgaze, вы знаете, что пропагандируете разницу в эффективности, которая не имеет значения в 99,99% приложений, в которых будет использоваться этот код, верно? Кроме того, с JIT-встраиванием он едва ли медленнее, как только HotSpot попадает в него. - person ; 06.10.2019

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

  • round (ближайшее целое число к заданному числу с плавающей запятой)

    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) для округления до ближайшего четного числа; возможно, это полезно, если вы планируете иметь дело с большим количеством чисел с плавающей запятой, дробная часть которых строго равна 0,5 (обратите внимание на возможные проблемы с округлением IEEE), и хотите сохранить среднее значение набора на месте; вы внесете еще одну предвзятость, хотя четные числа будут встречаться чаще, чем нечетные.

Видеть

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

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

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

person Community    schedule 19.03.2012
comment
rint - банковское округление; это помогает уменьшить количество ошибок, которые могут возникнуть, если вы последовательно округляете 0,5 в большую или меньшую сторону. - person prosfilaes; 06.10.2019
comment
@prosfilaes Я изменил формулировку и добавил ссылку на вики к этой части ответа. - person ; 06.10.2019

Math.round(value) округлить значение до ближайшего целого числа.

Использовать

1) b=(int)(Math.round(a));

2) a=Math.round(a);  
   b=(int)a;
person SHUNMUGA RAJ PRABAKARAN    schedule 29.11.2012

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

int b = Math.round(float a);
person venkat    schedule 04.03.2015
comment
В других ответах уже сказано об этом. Пожалуйста, добавляйте новый ответ только тогда, когда вам нужно добавить что-то новое. (Кроме того, Math.round не возвращает int.) - person Jeffrey Bosboom; 04.03.2015
comment
Он дает объяснение об отсутствии необходимости в приведении типов (на ответ Сахитры). Но его можно преобразовать в комментарий. - person Ranjith Kumar; 17.03.2017

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

float a = 8.61f;
int b = (int)Math.round(a);
person Sachithra Sewwandi    schedule 29.12.2014
comment
Math.round (float) возвращает int, я не уверен, почему необходимо приведение к int - person Nephilim; 12.06.2019

Создайте экземпляр объекта Float, передав примитив float в конструктор, а затем используйте созданный вами объект Float для возврата примитива int.

Explanation
Since number wrapper classes extend the java.lang.Number class, you can have any number wrapper object return any other number primitive type by using the .<type>Value() method.

Steps

  1. Создайте объект Float
  2. Используйте метод .intValue(), чтобы вернуть примитив int.

Example

Float mFloat = Float.valueOf(8.65f);
int i = mFloat.intValue();
person ike5    schedule 13.07.2021

Если вы хотите преобразовать значение с плавающей запятой в целочисленное значение, у вас есть несколько способов сделать это, в зависимости от того, как вы хотите округлить значение с плавающей запятой.

Первый способ - округление полми значения с плавающей запятой:

float myFloat = 3.14f;
int myInteger = (int)myFloat;

Результатом этого кода будет 3, даже если значение myFloat ближе к 4.

Второй способ - округлить значение с плавающей запятой:

float myFloat = 3.14f;
int myInteger = Math.ceil(myFloat);

На выходе этого кода будет 4, потому что режим округления всегда ищет максимальное значение.

person Community    schedule 02.07.2020

Math.round () достаточно

int b = Math.round(a)

Это сделает работу

person Haris Abdullah    schedule 16.03.2021
comment
Да, в принятом ответе сказано сделать то же самое. - person Null; 16.03.2021

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

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

person Bruno L.    schedule 22.01.2018
comment
Это запутает многих разработчиков, анализирующих код. Будет непонятно, что это округление. - person ivan.panasiuk; 01.02.2018
comment
Конечно, это всего лишь базовая математика, просто попробуйте - person Bruno L.; 02.02.2018
comment
Основная математика - понятие относительное. :) По своему опыту могу поспорить, что более 50% разработчиков не поймут, что это действительно округление. Это математически правильно, но, как я уже писал, непонятно, и другим трудно понять, что делает код. - person ivan.panasiuk; 04.02.2018
comment
-(int) ( PI / 3 ): попробуйте ваш код с отрицательным значением _2 _... с каких пор -0.5 округляется до 0? - person ; 08.03.2018
comment
вы правы, если число отрицательное, вы должны вместо этого добавить -0,5 - person Bruno L.; 10.03.2018