c++double类型保存位数问题

C++
进行double类型数据的计算时,存入的数据自动保存了3位小数,如何保存全部的位数

你咋保存的啊?

在C++中,double类型的变量通常具有15-17位有效数字。如果您在存储和显示double类型的变量时遇到精度丢失问题,通常是由于输出格式设置不正确引起的。这里有一个示例,展示如何使用std::coutiomanip库设置输出格式,以便显示所有有效数字:

#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::fixedstd::setprecision设置小数点后的位数。请注意,根据计算机的硬件和编译器,有效数字的数量可能会有所不同,但通常在15-17位之间。

如果您要将double类型的值保存到字符串中并保留所有有效数字,可以使用std::ostringstreamiomanip库。以下是一个示例:

#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对象中。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7801442
  • 这篇博客你也可以参考下:C++ 从文件中读取double类型数据
  • 除此之外, 这篇博客: c++ 关于double类型精度问题中的 原因,精度丢失 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 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,随着计算次数精度也不断损失,偏差越大

  • 您还可以看一下 王健伟老师的C++语言基础到进阶课程中的 理解模板类型推断、查看类型推断结果小节, 巩固相关知识点