计算器。每次单击数字按钮时,标记都会附加到“displaystring”nsmutable字符串。我注意到,在输入相同数字的11位数后,floatValue或intValue函数给出了同样的错误。
self.lbldisplay.text正确显示了displaytring的内容。但是 intValue或floatValue甚至NSCanner实用程序在输入10位数后返回相同的错误
这里是代码和日志:
// original
[self.displayString appendString: [NSString stringWithFormat: @"%i", [sender tag]]];
else { // new entry
//origin test
[self.displayString setString:@""];
[self.displayString appendString: [NSString stringWithFormat: @"%i", [sender tag]]];
bIsTypingANumber = TRUE;
}
// fCurrentNumber = [self.displayString floatValue];
// [self display:fCurrentNumber];
// self.lblDisplay.text = displayString;
NSString *numberString;
NSString *str = [NSString stringWithString:displayString];
NSScanner *theScanner = [NSScanner scannerWithString:str];
[theScanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
[theScanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:&numberString];
NSLog(@"Attempts: %i", [numberString integerValue]);
self.lblDisplay.text = str;
输出:
2012-08-26 17:23:34.264 Pilots Fuel[4989:f803] Attempts: 1
2012-08-26 17:23:34.400 Pilots Fuel[4989:f803] Attempts: 11
2012-08-26 17:23:34.552 Pilots Fuel[4989:f803] Attempts: 111
2012-08-26 17:23:34.800 Pilots Fuel[4989:f803] Attempts: 1111
2012-08-26 17:23:34.936 Pilots Fuel[4989:f803] Attempts: 11111
2012-08-26 17:23:35.072 Pilots Fuel[4989:f803] Attempts: 111111
2012-08-26 17:23:35.216 Pilots Fuel[4989:f803] Attempts: 1111111
2012-08-26 17:23:35.344 Pilots Fuel[4989:f803] Attempts: 11111111
2012-08-26 17:23:35.488 Pilots Fuel[4989:f803] Attempts: 111111111
2012-08-26 17:23:35.632 Pilots Fuel[4989:f803] Attempts: 1111111111
2012-08-26 17:23:35.776 Pilots Fuel[4989:f803] Attempts: 2147483647
2012-08-26 17:23:36.056 Pilots Fuel[4989:f803] Attempts: 2147483647
答案 0 :(得分:3)
这是因为溢出整数数据类型,它只能保存-2147483648到2147483647(大小为32位)的值。 double
数据类型可以包含更大的值,但最终会失去精度。
尝试
NSLog(@"Attempts: %lli", [numberString longLongValue]);
将使用64位精度并允许更多位数。
答案 1 :(得分:0)
欢迎来到SO。请写出清楚说明问题的问题。此外,如果您提供代码示例,请确保它们格式正确,以便其他人更容易阅读。
请注意,您使用的int
和float
都有大小限制。它们不能代表所有可能的数字。您可以使用双精度和64位整数,但它们也有限制。如果您确实需要更大的数字,请查看NSDecimalNumber
是否适合您的使用案例。它确实有一个限制(虽然非常大)。
如果您需要更大的数字,则需要使用一个为任意大数字提供支持的库。