为什么 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。
我正在尝试将字符串转换为双精度数,但是当我使用 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。