澄清双重数据类型的使用

时间:2019-07-12 12:39:54

标签: c++

我是C ++的初学者,在研究double和float的区别时,我遇到了https://www.thoughtco.com/definition-of-double-958065

现在,根据此网站,“双精度类型可以表示小数和整数值。它最多可以包含15个数字,包括小数点前后的数字。”

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

此外,我读到double比float更精确。但是,如果我在代码中将float替换为double,则会得到相同的结果。那么我怎么能说double比float更精确呢?

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

我看过无数篇有关数据类型为double的文章,但没有一篇能消除我的困惑。

-Understanding the datatype Double

所以基本上问题是

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

  • 即使float给出相同的输出,为什么它不如double精确?

  • 为什么不会在第二个代码中将整个数字加倍打印-为什么还要int 在这种情况下比两倍要精确。

1 个答案:

答案 0 :(得分:1)

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

要获得所需的内容,请尝试使用std::fixed I / O机械手:

#include <iostream>
#include <iomanip>
using namespace std;

int main ()
{
    double  x=388888883.53287;
    cout  << std::fixed << x ;
    return 0;
}

// Output: 388888883.532870

live demo

更一般而言,当您要取证检查程序中的数据时,请尝试使用调试器而不是流。这样可以防止外部因素影响您的结果而没有意识到!