Ios 数字超过1000万时,总和计算不正确

Ios 数字超过1000万时,总和计算不正确,ios,objective-c,xcode,Ios,Objective C,Xcode,我有一个文本字段(仅限数字)和一个UILabel,我正在使用按钮将其添加到一起。UILabel显示答案,文本字段在计算时变为空白。上面提到的计算和功能,在我开始想增加超过1000万个数字之前都可以正常工作。UILabel显示的答案为-2147483648。为了得到这个结果,我做的计算是0+100000000 我没有对这两个字段的字符长度设置任何限制,因此不确定为什么会发生这种情况 以下是我的计算代码: -(IBAction)addtotal2;{ float x = ([numberTextF

我有一个文本字段(仅限数字)和一个UILabel,我正在使用按钮将其添加到一起。UILabel显示答案,文本字段在计算时变为空白。上面提到的计算和功能,在我开始想增加超过1000万个数字之前都可以正常工作。UILabel显示的答案为-2147483648。为了得到这个结果,我做的计算是0+100000000

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

以下是我的计算代码:

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

任何帮助都将不胜感激。谢谢。

您遇到了溢出

使用
double
而不是
float
,您应该解决这个问题

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

如注释中所述,问题可能是
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

您正在经历溢出

使用
double
而不是
float
,您应该解决这个问题

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

如注释中所述,问题可能是
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

对于大值,应使用
double
,因为
float
32位的
,double是
64位的
,可以包含大值。

对于大值,应使用
double
,因为
float
32位的
,而double是
64位的
,可以包含大值。

更可能是整数溢出:-)(-2147483648是-2^31,如果是整数,则为%d格式)您是对的。添加到帖子中;)使用
double
在这里没有帮助,因为大概
dtotaler
是一个
int
。非常感谢,伙计,这很有效。但是现在它的数字超过100亿,我怀疑我会需要那么多,但万一有这么大的数字的想法吗?@Mustafa:使用
long-long-int
(大约19个十进制数字)或
NSDecimalNumber
(大约38个十进制数字)。更可能是整数溢出:-)(-2147483648是-2^31,如果是整数,则为%d格式)你是对的。添加到帖子;)使用
double
在这里没有帮助,因为大概
dtotaler
是一个
int
。非常感谢,伙计,这很有效。然而,现在它的数字超过100亿,我怀疑我会需要那么多,但万一有这么大的数字的想法?@Mustafa:使用
long-long-int
(约19位小数)或
NSDecimalNumber
(约38位小数)。