C++ 将长浮点数写入文件

C++ Write a long float number to a file

本文关键字:文件 浮点数 C++      更新时间:2023-10-16

file.txt

123.56
89.78
8.89
468.98
567.90
5.78
178908.90
12.56
6789.90
12.56
16.780
0.00

我已经将这些数字解析为一个名为 float A[150] = {0} 的数组。因此,A 看起来像:

A[0] = 123.56
A[1] = 89.78
....
....
A[10] = 16.780
A[11] = 0.00
A[12] = 0
A[13] = 0
...
...

然后,我有一个排序算法

Sort(A, i) // where i is the number of elements (12)

现在 A[] 看起来像

A[0] = 0
A[1] = 5.78
...
...
A[10] = 6789.90
A[11] = 178908.90

然后,我将其写入名为"Final.txt"的文件

std::ofstream File (Name);
if (File.is_open())
    {
        for (j = 0; j < i; j++)
        {
            File << A[j] << std::endl;
        }
    }

文件输出"Final.txt"如下所示:

0
5.78
8.89
12.56
12.56
16.78
89.78
123.56
468.98
567.9
6789.9
178909 // Why it is NOT CORRECT !!!!!!!

排序后 A[11] 的问题,为什么它在"Final.txt"中不正确,即使我在 A[11] 中调试它时它是正确的?

浮点值使用多个约束进行打印,以使值可读。例如,您可能不希望输出16.78 阅读

16.799999999999998

这很可能是16.78的更正确表示。为了避免operator <<流上的操作使用精度字段来确定要打印的有效数字数。 对于您的应用程序来说,此值显然设置得太小。

参考 http://en.cppreference.com/w/cpp/io/manip/setprecision。

其他格式设置由提供的链接 πάντα ῥεῖ 给出。

尝试输出时遇到不同的问题 178908.90

首先,c++ ostream 的默认实现通常输出 178909 ,因为正如长颈鹿船长所解释的那样,默认格式会尽力避免不相关的数字和精度

您可以尝试强制使用精度为 2 位的固定浮点数,但随后您将获得 178908.91(如果您使用 float 而不是双精度)。因为你会陷入第二个问题:C++,浮点数(浮点数或双精度数)使用 IEEE-754 格式,该格式仅提供大约 7 个十进制数字的精度,内部更像是:178908.906

所以规则是:如果你想保持大致的输入精度,不要使用超过6个十进制的数字作为浮点数和14个十进制数字作为双精度,如果你想保持严格的输入精度,根本不使用浮点!

您可以尝试使用其他答案中所示的十进制类型,也可以构建自己的类。