我所说的“全精度”是指不会出现正确结果与我用 C# 程序计算的结果不同的情况。
我通过在 C# 和 C++ 下运行相同的测试(不使用 cout. precision())来检查这一点。我确信我的程序在 C# 和 C++ 下的 2 个变体在相同的测试中表现相似。
C# 上的示例代码。
double a;
//...code...
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));
Run Code Online (Sandbox Code Playgroud)
相同,但在 C++ 上。
double a;
//...code...
cout << a << endl;
Run Code Online (Sandbox Code Playgroud)
实际上,我的没有 cout. precision() 的 C++ 程序失败了,而只有 Console.WriteLine() 的 C# 程序通过了。
我知道发生这种情况是因为我的 C++ 程序以某种方式(也许是神奇地)截断了数字并且精度丢失了。但是通过所有测试是否意味着 C# 总是以全精度打印 doulbe 变量?
如果使用“R”格式说明符格式化双精度,您将获得“往返”表示形式。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#RFormatString。用法:
string s = someDoubleValue.ToString("R");
Run Code Online (Sandbox Code Playgroud)
如果未指定,则默认格式说明符为“G”(常规),它“根据数字的类型以及是否存在精度说明符,将数字转换为最紧凑的定点或科学记数法” ”。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString。如果没有提供精度说明,double则获得 15 位精度,因此使用“G”可能会导致精度损失。