C ++在double和float中的输出不同

时间:2018-04-11 05:35:48

标签: c++ floating-point double precision

我有一个示例程序:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
  float a = 33.30;

  double b = 33.30;

  char a1[1024];
  char b1[1024];

  sprintf(a1, "%0.6f", a);
  sprintf(b1, "%0.6lf", b);

  cout << a1 << endl;
  cout << b1 << endl;

  return 0;
}

我得到的输出是:

33.299999
33.300000

我得到正确的结果为double和不正确的浮动。  我无法理解这种行为。  任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

33.3没有精确的有界二进制表示,因此将其转换为floatdouble会导致四舍五入。

float有一个23位的尾数,相当于精度的6.92十进制数字;在那里你要求打印8个数字,这些数字超过了可用的精度,因此将显示效果或舍入。

double有一个52位的尾数,相当于15.65个十进制数字; 8位有效数字打印保持良好,因为您仍然打印好的数字,不受舍入的影响。

在我们心爱的基础10中做一个更容易理解的例子:想象你有一个15位精度的十进制数据类型,并且你想要存储1/3。你能做的最好的是存储0.333333333333333;它们将它复制到具有6位精度的数据类型:它变为0.333333。

现在,如果你用8位十进制数字打印第一个值你得到0.33333333,而对于第二个你打印得到0.33333300 - 因为你已经丢失了转换中的其他数字。

这就是这里发生的事情,但是使用二进制浮点而不是十进制。

答案 1 :(得分:0)

这是浮动与双重差异的一个很好的答案。

What is the difference between float and double?

默认情况下,任何幻数(在程序中为33.30)都会被处理为double。当您执行float a = 33.30;时,发生了错误。