C编译器bug(浮点运算)?

#include int main() { double fract=0; int tmp; //scanf("%lf",&fract); fract=0.312; printf("%lf",fract); printf("\n\n"); while(fract>0){ fract*=(double)10; printf("%d ",(int)fract); fract-=(int)fract; } getch(); return 0; } 

这段代码的输出为:312

但是某些东西不对..我正在使用devcpp 4.9.9.2编译器……

Kernighan&Plauger在他们古老但经典的书“编程风格的元素”中说:

  • 一位聪明的老程序员曾经说过“浮点数就像一堆沙子;每次移动一个,你就会失去一点沙子并获得一点污垢”。

他们还说:

  • 10 * 0.1几乎不是1.0

两种说法都指出浮点运算不精确。

请注意,一些现代CPU(IBM PPC)内置了IEEE 754:2008十进制浮点运算。 如果使用正确的类型,那么您的计算将是准确的。

浮点运算令人困惑,并且不能保证直观行为。

这是一个很好的参考文档: 每个计算机科学家应该知道的浮点运算 。 这是一份很长的文件,因为这是一个复杂的问题。

总结:如果您依赖于确切的值,请不要使用浮点值。

所以你乘以1000乘以0.3119999999999999999895916591441391574335284531116485595703125并截断它并获得311? 我不知道问题出在哪里。