2013-04-07 1 views
1

У меня есть текстовое поле (только цифры) и UILabel, которые я добавляю вместе с использованием кнопки. UILabel отображает ответ, и текстовое поле гаснет при вычислении. Вычисления и упомянутая функциональность отлично работают, пока я не хочу добавлять номера более 10 миллионов. UILabel отображает ответ от -2147483648. Расчет, который я сделал, чтобы получить меня к этому результату, был 0 + 1000000000.Расчет суммы неправильный, если цифры более 10 миллионов

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

Вот код для моего расчета:

-(IBAction)addtotal2;{ 

float x = ([numberTextField.text floatValue]); 
float y = ([dtotal.text floatValue]); 
dtotaler = x + y; 
dtotal.text = [NSString stringWithFormat:@"%d",dtotaler]; 
numberTextField.text = @""; 
NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults]; 
[userDefaults setObject:[NSString stringWithFormat:@"%i",dtotaler] forKey:@"saveDtotal"]; 
[userDefaults synchronize]; 

Любая помощь будет принята с благодарностью. Благодарю.

ответ

5

У вас переполнение.

Используйте double вместо float, и вы должны исправить эту проблему.

double x = ([numberTextField.text doubleValue]); 
double y = ([dtotal.text doubleValue]); 

РЕДАКТИРОВАТЬ

Как было отмечено в комментарии, проблема может быть целым числом от переполнения по переменной dtotaler, то есть он может быть int слишком мал для удержания результата.

Если это так, то изменить тип dtotaler к NSInteger, который на прошивке типа синоним long

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 
+3

Скорее всего, переполнение целого числа :-) (-2147483648 равно -2^31, а формат% d, если для целых чисел) –

+0

Вы правы. Добавлено в сообщение;) –

+0

Использование 'double' здесь не помогло бы, потому что предположительно' dtotaler' является 'int'. – omz

2

Вы должны использовать double для большого значения, как float является 32-bit и двойник 64-bit и может содержат большое значение.

Смежные вопросы