往返文本和返回

Eya*_*ler 0 c cocoa printf nsnumber

使用Cocoa或basic c,我如何将double转换为字符串表示形式,然后将其转换回完全相同的double.可读性并不重要,只有准确性.例如,这将工作:
双a,b;
a =某个值;
b = [[[NSNumber numberWithDouble:a] stringValue] doubleValue];

Ada*_*eld 7

[编辑]实际上有一种方法可以在C99中执行此操作 - 使用%a格式说明符.这打印出十六进制科学记数法的双精度,因此不会损失精度.结果是准确的.例:

double d1 = 3.14159;
char str[64];
sprintf(str, "%a", d1);
// str is now something like "0x1.921f9f01b866ep+1"
...
double d2;
sscanf(str, "%la", &d2);
assert(d2 == d1);
Run Code Online (Sandbox Code Playgroud)

原答案如下:


大多数双字符串转换不能保证.您可以尝试将double打印到非常高的精度(double可以存储大约16个十进制数字),但浮点错误的可能性仍然很小:

// Not guaranteed to work:
double d = ...;
char str[64];
sprintf(str, "%.30g", d);
...
double d2;
sscanf(str, "%g", &d2);
Run Code Online (Sandbox Code Playgroud)

这将达到非常高的精度,但它仍然可能有几个ULP(最后一个单位)的错误.

你在做什么需要你在使用字符串时产生100%完全可重现的值?我强烈建议你重新考虑你想做什么.如果你真的需要一个精确的转换,只需将double存储为二进制的8个字节.如果需要以可打印格式存储,请将二进制数据转换为十六进制(16字节)或基数64.