0

一个计算器。每次我点击一个数字按钮时,标签都会附加到一个“displaystring”nsmutable 字符串。我注意到,在为相同的数字输入 11 位数字后,floatValue 或 intValue 函数给了我同样的错误。

self.lbldisplay.text 正确显示 displaystring 的内容。但是 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
4

2 回答 2

3

这是因为您溢出了整数数据类型,它只能保存从 -2147483648 到 2147483647(大小为 32 位)的值。数据类型可以保存更大的double值,但最终会丢失精度。

尝试

NSLog(@"Attempts: %lli", [numberString longLongValue]);

这将使用 64 位精度并允许更多位数。

于 2012-08-26T15:38:25.957 回答
0

欢迎来到 SO。请写出清楚地说明您的问题的问题。此外,如果您提供代码示例,请确保它们的格式正确,以便其他人更容易阅读。

请注意,您正在使用int并且float两者都有大小限制。它们不能代表所有可能的数字。您可以使用双精度和 64 位整数,但它们也有限制。如果您真的需要更大的数字,请查看是否NSDecimalNumber适合您的用例。它确实有一个限制(虽然相当大)。

如果您需要更大的数字,则需要使用支持任意大数字的库。

于 2012-08-26T15:40:28.673 回答