我是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
C++ different output in double and float
#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 尽管非常精确。
即使float给出相同的输出,为什么它不如double精确?
为什么不会在第二个代码中将整个数字加倍打印-为什么还要int 在这种情况下比两倍要精确。
答案 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
更一般而言,当您要取证检查程序中的数据时,请尝试使用调试器而不是流。这样可以防止外部因素影响您的结果而没有意识到!