2009-12-08 59 views
1

iPhone SDK 3.2.1铸造为一个NSNumber的doubleValue添加额外[幻象]精度

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

打印myDict到控制台的产率本说明书:myDict的

印刷描述: {类型= mutable,count = 2,capacity = 3,pairs =( 0:{contents =“testDoubleObject”} = {value = +0.10000000149011611938,type = kCFNumberFloat64Type} 1:{contents =“testDoubleValue”} = {value = +0.10000000149011611938 ,type = kCFNumberFloat64Type} )}

拉双打背出字典的显示了这些幻象位数被保留:

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

印刷doubleFromObject和doubleFromValue产生这在控制台:doubleFromObject的

印刷描述: {值= 0.10000000149011611938,类型= kCFNumberFloat64Type} doubleFromValue的

印刷描述: {值= 0.10000000149011611938,类型= kCFNumberFloat64Type}

当我尝试从一个字符串创建一个NSNumber的doubleValue同样的事情发生:

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

印刷doubleAsANumber得到这个控制台:doubleAsANumber的

印刷描述: {值= 0.10000000000000000555 ,type = kCFNumberFloat64Type}

这些额外的幻像数字引起我的问​​题。

1)是什么导致了这种情况发生?

2)如何摆脱那些额外的幻像数字?

回答

3

1.什么导致这种情况发生?

您所说的这些“幻影”数字是base-2中代表base-10数字的副产品。

2.如何摆脱这些额外的幻像数字?

摆脱它们的最好方法是使用固定精度类型,如NSDecimal