C++
进行double类型数据的计算时,存入的数据自动保存了3位小数,如何保存全部的位数
你咋保存的啊?
在C++中,double
类型的变量通常具有15-17位有效数字。如果您在存储和显示double
类型的变量时遇到精度丢失问题,通常是由于输出格式设置不正确引起的。这里有一个示例,展示如何使用std::cout
和iomanip
库设置输出格式,以便显示所有有效数字:
#include <iostream>
#include <iomanip>
int main() {
double value = 1.0 / 3.0;
// 设置输出为15位小数精度
std::cout << std::fixed << std::setprecision(15) << value << std::endl;
return 0;
}
此示例中,我们使用std::fixed
和std::setprecision
设置小数点后的位数。请注意,根据计算机的硬件和编译器,有效数字的数量可能会有所不同,但通常在15-17位之间。
如果您要将double
类型的值保存到字符串中并保留所有有效数字,可以使用std::ostringstream
和iomanip
库。以下是一个示例:
#include <sstream>
#include <iomanip>
#include <string>
#include <iostream>
int main() {
double value = 1.0 / 3.0;
std::ostringstream oss;
oss << std::fixed << std::setprecision(15) << value;
std::string result = oss.str();
std::cout << "Double value with all digits: " << result << std::endl;
return 0;
}
在这个示例中,我们使用与前面示例相同的方法设置输出格式,然后将结果保存到一个std::string
对象中。
MATLAB输出的是约等于的值(应该也是c++开发的),因此和真实计算结果产生偏差,通过矩阵运算将差值放大
例子:
#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char *argv[])
{
double h1=1.21212;//手动赋值
double h2=1.21212;//手动赋值
double c1=4.0/3.3;//手动赋值
cout << "手动赋值a:"<< h1 << "\t手动赋值b:" << h2 << endl;
cout << "计算赋值:"<< c1 << endl;
cout << "手动是否相等:"<< ((h2==h1)?"相等":"不等") << endl;
cout << "手动值和计算值是否相等:"<< ((c1==h1)?"相等":"不等") << endl;
cout << fixed << setprecision(16) << "手动" << h1 << "计算" << c1 << endl;
return 0;
}
输出
C:\Users\Administrator\Desktop\git>g++ test.cpp&& a.exe
手动赋值a:1.21212 手动赋值b:1.21212
计算赋值:1.21212
手动是否相等:相等
手动值和计算值是否相等:不等
手动1.2121200000000001计算1.2121212121212122
可以看出直接输入和计算出的是不一致的,自然不是同一个数,且double类型精度16,随着计算次数精度也不断损失,偏差越大