2009-12-08 26 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