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} )}

将双打从字典中拉出来表明这些幻象数字被保留了:

 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 回答