月別アーカイブ: 2014年9月

iOS8で NSDecimalNumber が変な値を返してくる!(怒)

iOS8上でなぜか変な挙動を示すアプリがあったので原因を調査してみたところ、NSDecimalNumber の integerValue や longValue が変な値を返すようになっていた。

検証コード

NSDecimalNumber* n = [NSDecimalNumber decimalNumberWithString:@"123.123456789012345678"];
if ([n intValue] !=[n integerValue]){
    NSLog(@"What?!");
    NSLog(@"decimal %@", n);           
    NSLog(@"int %d", [n intValue]);
    NSLog(@"integer %ld",[n integerValue]);
    NSLog(@"long %ld", [n longValue]); 
    NSLog(@"longlong %lld", [n longLongValue]);
    NSLog(@"uinteger %ld",[n unsignedIntegerValue]);
 } else {
    NSLog(@"success!!");
 }

このコードを実行すると iOS7.1(64bit)では次のように素直な値が表示されます。

decimal 123.123456789012345678
int 123
long 123
longlong 123
integer 123
uinteger 123

でもこれがiOS8だと・・
64bit環境では
decimal 123.123456789012345678
int 123
integer -6
long -6
longlong -6
uinteger 12

32bit環境では
decimal 123.123456789012345678
int 123
integer 0
long 0
longlong -6
uinteger 0

って結果となる。なんでやねん!!

NSDecimalNumberを”123.123456″とかで初期化するとこの問題は発生しないんだよね。
桁数の問題であれば NSDecimalNumber を初期化する際にまるめておけば(有効桁数が十分なのであれば)解決するんだけど、どうだんんだろ?

なんにせよ、iOS8のバグだよね。きっと。