例如,在此表中,他们说 7 位数字为浮点型,15 位数字为 double 型: https://learn.microsoft.com/en-us/cpp/cpp/data-type-ranges
但是这个语句返回 9:
std::cout << std::numeric_limits<float>::max_digits10 << '\n';
添加此返回 17:
std::cout << std::numeric_limits<double>::max_digits10 << '\n';
也许我们应该从位数中减去+或-号以及点? 在这里他们说这种精度保证在文本 -> 数字 -> 文本转换后保留数字: https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10
但是当我这样做时,精度始终为 7,在 double 的情况下也是:
#include <iostream>
#include <string>
int main() {
double d_example = 0.123456789;
std::string str_example = std::to_string(d_example);
d_example = stod(str_example);
std::cout << str_example << '\n';
std::cout << d_example << '\n';
}
最佳答案
这些数字是不同操作的特征。
最大十进制位数 ( numeric_limits<>::max_digits10
):如果将 float 转换为具有至少那么多十进制位数(不包括句点等非数字字符)的字符串,然后返回一个数字,结果数字保证等于原始数字。
十进制数字 ( numeric_limits<>::digits10
):如果最多那么多十进制数字(不包括非数字字符,如句点)的字符串转换为 float ,然后再转换回来对于具有相同小数位数的字符串,结果字符串保证与原始字符串表示相同的数字。
单精度 float 的十进制数字值实际上是 6,而不是 7。有时非正式地给出为 7,因为大多数 7 位字符串的测试都会成功。
关于c++ - C++ 中 float、double 或 long double 的精度是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66986911/