intvalue,floatValue的问题

时间:2012-08-26 15:25:48

标签: iphone

计算器。每次单击数字按钮时,标记都会附加到“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

2 个答案:

答案 0 :(得分:3)

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

尝试

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

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

答案 1 :(得分:0)

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

请注意,您使用的intfloat都有大小限制。它们不能代表所有可能的数字。您可以使用双精度和64位整数,但它们也有限制。如果您确实需要更大的数字,请查看NSDecimalNumber是否适合您的使用案例。它确实有一个限制(虽然非常大)。

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