【发布时间】:2021-04-17 00:16:37
【问题描述】:
如果我有一个double 变量,我想使用标准的四舍五入规则将它的值存储到一个文件中的小数点后两位。我不仅想存储和显示最多两位小数的数据,而且我还想使用这些数据进行算术运算,当我重新打开文件时,精确到两位小数。换句话说,当我将文件中的这些数据读入double 变量时,我希望这些数据也能准确地加载到小数点后两位,就像我存储它一样。到目前为止,使用<iomanip> 和fixed 和setprecision 仅用于显示与std::cout 一起使用的输出。不过我可能是错的。请使用以下示例说明如何完成此操作?另外如何将来自double 变量的数据存储到binary 文件中的小数点后两位?
std::ofstream file("data.txt");
int hours = 8, mins= 35;
char ap='p';
double format_24_hr=0.00;
format_24_hr = static_cast<double>(hours) + 12.00 + static_cast<double>(mins)/60.00;
file<<format_24_hr; // how to store double to two decimal places in a binary file
file.close();
另外,当我像下面这样读取文件时,如何确保它加载的数据与我存储的数据完全相同?
std::ifstream file("data.txt");
double var=0.00;
file>>var; // would the data read here be exactly loaded to two decimal places as I stored it?
file.close();
【问题讨论】:
-
你所要求的在物理上是不可能的。基于二进制的
doubles 不能准确地保存所有十进制值。 -
更具体地说,您可以准确存储
4.25,但最接近4.26的是4.2599999999999997868371792719699442386627197265625。 -
将数据存储/读取为“原始”值的 100 倍的 整数 值。
-
当您的所有需求都达到fixed-point 表示时,为什么要将您的值存储在浮点 表示中?您可以更改变量的类型吗?
-
查看Is floating point math broken?,看看它是否能让事情变得更清楚。