Я конвертирую четыре байта в число с плавающей точкой, и в результате получаю NaN, но мне нужно значение 0.0. Что я делаю не так?
NaN
0.0
Это мой код:
public class abc { public static void main(String[] args) { int[] arry = { 255, 255, 255, 255 }; int num = ((arry[0] << 24) & 0xFF000000) | ((arry[1] << 16) & 0xFF0000) | ((arry[2] << 8) & 0xFF00) | (arry[3] & 0xFF); float f = Float.intBitsToFloat(num); f= (float) ((f < 0 ? Math.ceil(f * 10) : Math.floor(f * 10)) / 10); System.out.println(f); } }
Ваша главная проблема в том, что 0xFFFFFFFF действительно является NaN.
0xFFFFFFFF
Число с плавающей запятой со значением 0 равно ... 0.
Изменение массива на
int[] arry = { 0x00, 0x00, 0x00, 0x00 };
Изменит результирующее значение на 0.0f с плавающей точкой.
0.0f
Ну, ваш битовый паттерн происходит на самом деле be NaN:
IEEE 754 NaN представлены с экспоненциальным полем, заполненным единицами, и некоторым ненулевым числом в значении. Побитовый пример IEEE с плавающей точкой стандартной одинарной точности NaN: x111 1111 1axx xxxx xxxx xxxx xxxx xxxx, где x означает все равно . Если a = 1, это тихий NaN, в противном случае это сигнальный NaN.
Поскольку все ваши биты равны 1, он явно соответствует вышеуказанным критериям и является тихим NaN (хотя Java iirc даже не поддерживает тихие или сигнальные NaN).
NaN = не число, т. Е. Битовая комбинация 0xFFFFFFFF не представляет собой число с плавающей запятой число. (Иоахим, ты прав .. опять :-))