2012-03-08 50 views
0

在我正在建設的應用程序中,我使用了一些非常小的數字(4.12027703723203E-18,7.685842358296843E-21, 6.882072376426952E-24, 2.7150860398820128E-27等)。節省雙倍不失精度

的問題是,當我將它們存儲到陣列中,他們變成0的代碼位:

-(BOOL)checkNewInfo:(NSIndexPath*)indexPath andValue:(double)value { 
    //code omitted 
    [self.theValues replaceObjectAtIndex:indexPath.row withObject:[NSString stringWithFormat:@"%f", value]]; 
    //code omitted 
} 

我做了一些調試和這裏的結果:

(gdb) p (double) value 
$1 = 4.12027703723203e-18 
(gdb) po [self theValues] 
<__NSArrayM 0x6a45dc0>(
1.6086921836575816E-11, 
3.7511646463463610E-13, 
0.000000, 
4.6856843535196843E-21, 
9.820723621786952E-24 
) 

的初始數字來自文本文件,並且可以輕鬆訪問和使用它們。

因此,我更換了索引號2(舊的5.12027703723203E-18,新的4.12027703723203E-18)。所以理論上這個數字不應該改變,但實際上它變成了0.000000

爲了保持數字我該怎麼做?

謝謝,任何幫助將不勝感激

回答

1

嘗試使用%e%E。 %f始終以0.00000格式打印

-1

你唯一的選擇是將數字存儲在他們的二進制格式。

2

您在使用期間格式化%f,因此輸出爲0.00000

如果要保留16位數字的精度,則應該使用%e,或者甚至使用%.16e

[self.theValues replaceObjectAtIndex:indexPath.row withObject:[NSString stringWithFormat:@"%.16e", value]]; 
2

1)不要將值存儲爲字符串,但作爲NSNumbe或更好,
2)使用NSDecimalNumber(128位浮點)