1

iPhone SDK 3.2.1

 NSMutableDictionary *myDict = [NSMutableDictionary dictionaryWithCapacity:2];
 [myDict setObject:[NSNumber numberWithDouble:0.1f] forKey:@"testDoubleObject"];
 [myDict setValue:[NSNumber numberWithDouble:0.1f] forKey:@"testDoubleValue"];

myDict の説明をコンソールに出力すると、次のようになります。

myDict の説明の出力: {type = mutable, count = 2, capacity = 3,pairs = ( 0 : {contents = "testDoubleObject"} = {value = +0.10000000149011611938, type = kCFNumberFloat64Type} 1 : {contents = "testDoubleValue"} = {値 = +0.10000000149011611938、タイプ = kCFNumberFloat64Type} )}

double を dict から引き戻すと、これらの幻の数字が保持されていることがわかります。

 NSNumber *doubleFromObject = [myDict objectForKey:@"testDoubleObject"];
 NSNumber *doubleFromValue = [myDict valueForKey:@"testDoubleValue"];

doubleFromObject と doubleFromValue を出力すると、コンソールに次のように表示されます。

doubleFromObject の出力説明: {value = +0.10000000149011611938, type = kCFNumberFloat64Type}

doubleFromValue の出力説明: {value = +0.10000000149011611938, type = kCFNumberFloat64Type}

文字列から NSNumber doubleValue を作成しようとすると、同じことが起こります。

 NSString *doubleAsAString = @"0.1";
 NSNumber *doubleAsANumber = [NSNumber numberWithDouble:[doubleAsAString doubleValue]];

doubleAsANumber を出力すると、コンソールに次のように表示されます。

doubleAsANumber の出力説明: {value = +0.10000000000000000555, type = kCFNumberFloat64Type}

これらの余分な幻の数字が問題を引き起こしています。

1) これが起こる原因は何ですか?

2) 余分な幻の数字を取り除くにはどうすればよいですか?

4

1 に答える 1

3

1. これが起こる原因は何ですか?

あなたが言うように、これらの「ファントム」数字は、 base-2で base -10数値を表すことの副産物です。

2. 余分な幻の数字を取り除くにはどうすればよいですか?

それらを取り除く最善の方法は、NSDecimalなどの固定精度型を使用することです。

于 2009-12-08T19:30:57.447 に答える