2012-07-18 50 views
0

我有一個值被存儲爲一個NSDecimalNumber,當我將它轉換爲雙精度時,它正在失去精度。如何將NSDecimalNumber轉換爲雙倍

對於我正在調試的當前數據段,值爲0.2676655。當我發送一個doubleValue消息時,我得到0.267665。它截斷而不是四捨五入,這對一些使用哈希來檢測數據更改以進行同步操作的代碼造成嚴重破壞。

NSDecimalNumber實例來自第三方框架,所以我不能用原語double來代替它。最終它被插入到一個NSMutableString中,所以我在一個字符串表示後,但它需要通過一個格式說明符「%.6lf」,基本上我需要小數點後六位數字,因此它看起來像0.267666。

我該如何做到這一點而不失精度?如果有一種很好的方式來格式化NSDecimalNumber而不轉換爲雙精度,那也可以。

回答

4

NSDecimalNumber實例來自第三方框架,所以我 不能用一個原始的double來代替它。

是的,你可以。 NSDecimalNumber是NSNumber的,這是一個有點太有幫助的一個不變的子類,當涉及到轉換:

double myDub = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:((double)0.2676655)] doubleValue]]; 

最終它被插入的NSMutableString所以我一個 字符串表示之後,但是它需要通過格式 說明符「%.6lf」,基本上我需要小數點後六位數,所以 看起來像0.267666。

雙精度遺憾的是不圓的,而是得到一個字符串值,通過百萬分之一的斷不是什麼大不了的事(我希望)的:

NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:((double)0.2676655)] decimalValue]]; 
NSString *numString = [NSString stringWithFormat:@"%.6lf", [num doubleValue]]; 
NSLog(@"%@",numString); 
2

我認爲你是在錯誤的路徑和某處失去了做什麼。

首先,請記住,在objective-c lond double中是不支持,因此您最好使用類似%f而不是%lf的內容。 [可在目標c運行時編程指南的「類型編碼」下的文檔庫中找到]

然後我寧可期望值顯示爲被截斷,因爲doubleValue返回近似值,但範圍你正在使用的是在正確的範圍內。

你應該用一個簡單的格式,而不是中移動的數字,如:

// first line as an example for your real value 
    NSDecimalNumber *value = [NSDecimalNumber decimalNumberWithString:@"0.2676655"]; 
    NSNumberFormatter *numFmt = [[NSNumberFormatter alloc] init]; 
    [numFmt setMaximumFractionDigits:6]; 
    [numFmt setMinimumFractionDigits:6]; 
    [numFmt setMinimumIntegerDigits:1]; 
    NSLog(@"Formatted number %@",[numFmt stringFromNumber:value]); 

這有如果需要使用的語言環境意識到格式化的另一個好處。數字格式化程序的結果是所需的字符串。

相關問題