C++ 将长浮点数写入文件
C++ Write a long float number to a file
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个十进制数字作为双精度,如果你想保持严格的输入精度,根本不使用浮点!
您可以尝试使用其他答案中所示的十进制类型,也可以构建自己的类。
- txt 文件中浮点数的最大和最小值
- 解析文本文件中的字符串、整数和浮点数
- 将浮点数保存在文本文件中,然后从文本文件加载回去(OpenGL和C++)
- 读取文件由c 中的mmap()的浮点数组成
- 如何将.txt文件中的浮点数据写入带有VS2017的二维数组
- 有没有办法更有效地将二进制双精度从文件读取到浮点数组中
- 将浮点数的文本文件读取到C++中的 2D 矢量中
- 从文件中读取 4 个十六进制值并转换为浮点数
- 如何从C++文件中的特定行中提取数字(浮点数)
- C++ 程序,用于将具有恒定(但未知)列数的未知大小的 CSV 文件(仅填充浮点数)读取到数组中
- 将浮点数四舍五入为2位小数,将其写入文本文件
- C++到C#将二进制文件读取到二维浮点数组中
- 从.txt文件中读取浮点数
- 使用c++高效地将浮点数写入CSV文件
- 从文本文件中读取多行浮点数
- c++如何从文件中读取浮点数并存储到另一个文件中
- 如何用ifstream和istreambuf_iterator读取二进制文件作为浮点数
- 从文件中读取浮点数并将其存储到数组中
- 将由空格分隔的浮点数组成的文本文件映射到浮点数向量的内存
- 从文本文件中读取浮点数并复制到浮点数向量中