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没有精确的有界二进制表示,因此将其转换为
为了使我们所钟爱的基数10中的示例更易于理解:假设您有一个精度为15位的十进制数据类型,并且希望在其中存储1/3。最好的方法是存储0.33333333333333;将其复制到具有6位精度的数据类型中:它将变为0.333333。
现在,如果用8位十进制数字打印第一个值,则得到0.33333333,而对于第二个值,则得到0.33333300,因为在转换过程中已经丢失了其他数字。
这就是这里发生的事情,但是使用二进制浮点而不是十进制。
这里有一个很好的答案来解释浮点数和双精度数的区别。
浮点数和双精度数有什么区别?
默认情况下,任何幻数(如程序中的33.30)都将处理为双精度。当您执行