为什么 stod() 缩短了我从字符串转换为双精度的数字?

Why is stod() shortening the number I am converting from string to double?

我正在尝试将字符串转换为双精度数,但是当我使用 stod() 时,双精度数丢失了一些小数位。 这是相关代码:

    cout << line3 << endl;
    float temp = stod(line3);
    cout << temp << endl;

例如,当第 3 行为“4.225308642”时,temp 输出为 4.22531。是什么导致数字缩短,我该如何解决?

这里有两个方面需要考虑。

首先,在IOStream上格式化默认精度为6位有效数字。这解释了你的结果。您可以使用操纵器 setprecision.

提高精度

然后,float 本身也有大约 6 位小数的有限精度。尽管您可以显示更多,但它们将是将二进制浮点数显示为十进制的结果,而不是真正提高精度。使用 double 可以获得大约 15 位小数的精度。

所以结合两者,程序

#include <iostream>
#include <string>
#include <iomanip>

int main() {
    std::string line3 = "4.225308642";
    std::cout << line3 << '\n';
    float tempf = stof(line3);
    double tempd = stod(line3);
    std::cout << "default: float=" << tempf << ", double=" << tempd << '\n';
    std::cout << std::setprecision(20);
    std::cout << "precision(20): float=" << tempf << ", double=" << tempd << '\n';
}

结果为:

4.225308642
default: float=4.22531, double=4.22531
precision(20): float=4.2253084182739257812, double=4.2253086419999998924

再次注意,显示二进制格式的最后数字结果。有一个精度,在此之后您不能期望与输入匹配的十进制表示,并且 20 大于该精度。这方面有更详细的解释 here