Двойной и длинный длинный не одно и то же. Длинный представляет целое число, которое не имеет дробной части, а двойное представляет число с плавающей запятой, которое имеет дробную часть. Эти два типа имеют совершенно разные способы представления своих значений в памяти. То есть, если бы вы посмотрели на биты long long, представляющие число 4000, и сравнили их с битами для double, представляющего число 4000, они были бы другими.
Итак, как замечает Вева, первым шагом для вас будет использование правильного типа double и правильного средства форматирования% f при вызове NSLog ().
Я бы добавил, однако, что вам также нужно быть осторожным, чтобы ваши байты были в исходном порядке для машины, на которой работает код C. Подробное описание того, что я имею в виду, см. В http://en.wikipedia.org/wiki/Endianness. Короткая версия состоит в том, что разные процессоры могут по-разному представлять числа в памяти, и вы должны убедиться, что в вашем коде, как только вы получите кучу байты из сети, вы устанавливаете байты в правильном порядке для вашего процессора, прежде чем пытаться интерпретировать его как число.
К счастью, это решенная проблема, и ее легко объяснить с помощью функции CFConvertFloat64SwappedToHost () из CoreFoundation:
[stream getBytes:buffer length:8];
[stream replaceBytesInRange:dblRange withBytes:NULL length:0];
double myDouble = CFConvertFloat64SwappedToHost(*((double*)buffer));
NSNumber *tempNum = [NSNumber numberWithDouble:myDouble];
NSLog(@"\n***********\nsizeof double %d \n tempNum: %@\nbits %f",sizeof(double), tempNum, myDouble);
return [tempNum doubleValue];