澄清了双精度数据类型的使用

Clarification on the usage of double datatype

本文关键字:数据类型 双精度      更新时间:2023-10-16

我是C++初学者,在研究双精度和浮点数之间的区别时,我遇到了 https://www.thoughtco.com/definition-of-double-958065

现在,根据这个网站,"双精度类型可以表示分数和整数值。它总共最多可以包含 15 位数字,包括小数点之前和之后的数字。">

所以如果我想存储一个值,比如说,33.53287,我应该能够做到这一点。但是当我这样做并打印我的变量时,它给了我输出 33.5329 . 为什么会这样? 根据上面提到的行,只要我们包含少于 15 位数字,我们就应该没问题。但为什么会有这样的结果呢?

另外,我读到双精度比浮点数更精确。但是如果我在我的代码中用浮点数替换双精度,我会得到相同的结果。那么我怎么能说双精度比浮点更精确呢?

不仅如此,如果我用更大的 14 位数字(包括小数点前后的数字)替换我的数字,我会得到 3.88889e+008 的答案 但是,如果我用 int 替换 double,我会得到388888883。 显然,使用 int 作为数据类型获得的结果比使用 double 作为数据类型获得的结果更精确。同样,这是违反直觉的,因为 int 占用 4 个字节,而双 8 字节。

我看过许多关于数据类型双精度的文本,但没有一个可以消除我的困惑。

-了解数据类型双精度

  • 浮点数和双精度有什么区别?
  • https://www.geeksforgeeks.org/difference-float-double-c-cpp/
  • C++双精度和浮动型的不同输出

    #include <iostream>
    using namespace std;
    int main ()
    {
    double x=33.53287;
    cout  << x ;
    return 0;
    }
    #include <iostream>
    using namespace std;
    int main ()
    {
    double  x=388888883.53287;
    cout  << x ;
    return 0;
    }
    

所以基本上问题是

  • 为什么双精度不给出 33.53287作为输出,而是给出 33.5329 尽管非常精确。

  • 即使浮点给出相同的输出,为什么它不如双精度精确?

  • 为什么不用第二个代码重复打印整个数字 - 为什么 int 更多 在这种情况下,精确比双倍。

您对数据类型的看法是正确的,但您没有考虑cout的工作方式。流具有许多格式选项,默认情况下,它们为您提供的有效数字比您在这种情况下要查找的有效数字要少。他们试图对此保持聪明,但不可能自动满足所有需求。

要获得您想要的,请尝试std::fixedI/O 操纵器:

#include <iostream>
#include <iomanip>
using namespace std;
int main ()
{
double  x=388888883.53287;
cout  << std::fixed << x ;
return 0;
}
// Output: 388888883.532870

(现场演示)

更一般地说,当您想要对程序中的数据进行取证检查时,请尝试使用调试器而不是流。这样可以防止外部因素在您不知不觉中影响您的结果!