Сохранение в два раза без потери точности - PullRequest
0 голосов
/ 08 марта 2012

В приложении, которое я создаю сейчас, я использую несколько действительно маленьких чисел (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.

Что мне делать, чтобы сохранить числа?

Спасибо, любая помощь будет очень полезнацениться

Ответы [ 4 ]

2 голосов
/ 08 марта 2012

Вы форматируете во время использования %f, поэтому на выходе получается 0.00000.

Вы должны использовать %e или даже %.16e, если хотите сохранить точность 16 цифр.

[self.theValues replaceObjectAtIndex:indexPath.row withObject:[NSString stringWithFormat:@"%.16e", value]];
2 голосов
/ 08 марта 2012

1.) Не храните значения в виде строки, но как NSNumbe или лучше,2.) Используйте NSDecimalNumber (128-битная с плавающей точкой)

1 голос
/ 08 марта 2012

Попробуйте использовать %e или %E.% f всегда печатает в формате 0,00000

0 голосов
/ 08 марта 2012

Ваш единственный вариант - хранить числа в двоичном формате.

...