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 に答える