我有一个示例程序:
#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和不正确的浮动。 我无法理解这种行为。 任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
33.3没有精确的有界二进制表示,因此将其转换为float
或double
会导致四舍五入。
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;
时,发生了错误。