关于浮点:C ++在double和float中的输出不同

C++ different output in double and float

本问题已经有最佳答案,请猛点这里访问。

我有一个示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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;
}

我得到的结果是:

1
2
33.299999
33.300000

我得到了正确的双精度结果和不正确的浮点数。我无法理解这种行为。任何帮助都将不胜感激。


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

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

double的尾数是52位,相当于15.65位十进制数字;8位有效数字的打印效果很好,因为您仍在打印好的数字,不受舍入的影响。

为了使我们所钟爱的基数10中的示例更易于理解:假设您有一个精度为15位的十进制数据类型,并且希望在其中存储1/3。最好的方法是存储0.33333333333333;将其复制到具有6位精度的数据类型中:它将变为0.333333。

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

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


这里有一个很好的答案来解释浮点数和双精度数的区别。

浮点数和双精度数有什么区别?

默认情况下,任何幻数(如程序中的33.30)都将处理为双精度。当您执行float a = 33.30;操作时,发生了一个错误。