2013-04-07 70 views
1

我有一个textfield(仅数字)和一个UILabel,我正在使用一个按钮一起添加。 UILabel显示答案,并且Textfield在计算时变为空白。提到的计算和功能,工作正常,直到我开始想要添加超过1000万的数字。 UILabel显示-2147483648的答案。我为了得到这个结果而做的计算是0 + 1000000000.当数字超过一千万时,计算总和不正确

我没有对任何字段的字符长度设置任何限制,所以不确定为什么会发生这种情况。

这里是我计算的代码:

-(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]); 

EDIT

如在评论中所指出,问题可能是对dtotaler变量的整数溢出,即,它可以是int太小用于保持的结果。

如果是这样的情况下,dtotaler类型更改为NSInteger,这在iOS上是一种代名词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格式) – 2013-04-07 17:57:38

+0

你说得对。添加到帖子;) – 2013-04-07 18:00:13

+0

使用'double'在这里没有帮助,因为大概'dtotaler'是一个'int'。 – omz 2013-04-07 18:03:03

2

您应该使用double大型值float32-bit和双是64-bit并能包含很大的价值。