最近我不得不将双序列化为文本,然后将其取回.该值似乎不相等:
double d1 = 0.84551240822557006;
string s = d1.ToString("R");
double d2 = double.Parse(s);
bool s1 = d1 == d2;
// -> s1 is False
Run Code Online (Sandbox Code Playgroud)
但根据MSDN:标准数字格式字符串,"R"选项应该保证往返安全.
往返("R")格式说明符用于确保转换为字符串的数值将被解析回相同的数值
为什么会这样?
自 20 世纪 90 年代起,人们就知道如何快速准确地打印浮点数。Scheme和Java编程语言已经实现了这个算法,但我在C++中找不到类似的东西。
本质上,我正在寻找一小段高效的代码来满足以下测试用例:
void test(double dbl, const char *expected) {
std::string actual = ...;
assert(actual == expected);
}
test(3.0, "3.0");
test(3.1, "3.1");
test(0.1, "0.1");
test(1.0 / 3.0, "0.3333333333333333"); // Or maybe one more digit?
Run Code Online (Sandbox Code Playgroud)
双精度字面值会转换为浮点数,浮点数可能与字面值相同,也可能不同。然后,浮点数被转换回字符串。该字符串应尽可能短,同时表示十进制数,当解释为双精度文字时,将再次产生相同的浮点数。
如何使用 cout 以全精度打印双精度值?看起来相关,但接受的答案中的代码无法正确处理 3.1 情况。