保存双倍而不会失去精度

时间:2012-03-08 11:35:02

标签: objective-c ios double

在我正在构建的应用中,我使用了一些非常小的数字(4.12027703723203E-187.685842358296843E-216.882072376426952E-242.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 个答案:

答案 0 :(得分:2)

您正在使用%f进行格式化,因此输出为0.00000

如果你想保持16位数的精确度,你应该使用%e,甚至是%.16e

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

答案 1 :(得分:2)

1。)不要将值存储为字符串,而是存储为NSNumbe或更好,
2.)使用NSDecimalNumber(128位浮点)

答案 2 :(得分:1)

尝试使用%e%E。 %f始终以0.00000格式打印

答案 3 :(得分:-1)

您唯一的选择是以二进制格式存储数字。