C++ 文件 IO:读取“29.0”的输入加倍但输出为“29”,即删除“.0”

C++ File IO: read input of "29.0" to double but output is "29", i.e. ".0" removed

我使用以下代码从文件中读取数据。 输入文件是

29.0 45.0 0.0 15.0

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(){
    string fileName;
    cout << "input the file: ";
    cin >> fileName;

    double temp1=0.0, temp2=0.0, temp3=0.0, temp4=0.0;

    ifstream fin;
    fin.open(fileName.c_str());

    if(!fin.is_open()){
        cout << "Could not open file" << endl; 
    }

    fin >> temp1 >>temp2 >>temp3 >>temp4;

    cout << temp1 << " " << temp2 << " " << temp3 <<" " <<temp4 <<endl;
    fin.close();
}

但我得到的是 29 45 0 15 而不是 29.0 45.0 0.0 15.0

如果我将数据文件更改为29.1 45.1 0.1 15.1,那么我得到的正好是29.1 45.1 0.1 15.1

有人知道为什么会这样吗?

如果您想保留“.0”等当且仅当它出现在输入中时,您需要将值作为文本读取 - 例如进入 std::string 秒。当您读入 doubles 时,将存储逻辑值(在确切的文本值在 double 中没有按位表示的情况下会尽可能地存储逻辑值,例如 0.1 无法准确表示),由输出代码猜测您想要的位数 - 默认情况下,它猜测尾随的“.0”对 [=26 没有价值=].

您可以使用像 std::fixed and std::setprecision 这样的 io 操纵器来更改它 - 两个页面都有有用的示例,为方便起见,下面复制了 setprecision 一个:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <limits>
int main()
{
    const long double pi = std::acos(-1.L);
    std::cout << "default precision (6): " << pi << '\n'
              << "std::precision(10):    " << std::setprecision(10) << pi << '\n'
              << "max precision:         "
              << std::setprecision(std::numeric_limits<long double>::digits10 + 1)
              << pi << '\n';
}

输出:

default precision (6): 3.14159
std::precision(10):    3.141592654
max precision:         3.141592653589793239