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