user-0 提问: 是浮点误差问题？

回复:
user: user-0
content: 问题基本上是解决了，谢谢大家的解答！结贴啦

user: user-0
content: 引用 6 楼 zy205817 的回复: #include <stdio.h>  int main() {     float a = 4.01;     int b;     b = a * 100;     printf("%d\n",b);     printf("%d\n",(int)(4.01 * 100));     return 0; }  double只是近似值 那float也是吧，只是精度不同了，换成float恰好从400变成401了（可能就是5楼所说的原因），不过如果再改一下，4.01换成1.01，问题还是存在的，以下代码： #include<stdio.h> int main() {     float a=1.01;     int b,n,m;     b=a*100;     printf("%d\n",b);     printf("%d\n",(int)(1.01*100)); } 输出为： 100 101 ——————五楼说的有道理——————

user: user-0
content: 引用 11 楼 zjq9931 的回复:[quote=引用 10 楼 BensonLaur 的回复:] [quote=引用 2 楼 user-7 的回复:] 简单地说，浮点数无法精确表示4.01，只能表示成4.010000001或者4.009999999 上面这两个数只是距离，准确的说，浮点数无法精确表示任何“不等于2的-n次方的整数倍的小数” 那printf("%d\n",b);     printf("%d\n",(int)(4.01*100)); 这两句的结果感性来讲应该是结果相同的吧，结果不同也有点费解，这是不是因为5楼最后一句说的呢——“......这种误差无法预测，不同的编译器，或者不同的机器环境，使用不同的运算顺序、汇编指令运算，所以相同的代码，结果也是不能预测的”[/quote] 个人感觉最好看一下汇编代码，看看着两个句子在你的编译器中生成的汇编代码又什么不同。[/quote] 嗯嗯

user: user-1
content: 引用 10 楼 BensonLaur 的回复:那printf("%d\n",b);     printf("%d\n",(int)(4.01*100)); 这两句的结果感性来讲应该是结果相同的吧，结果不同也有点费解，这是不是因为5楼最后一句说的呢——“......这种误差无法预测，不同的编译器，或者不同的机器环境，使用不同的运算顺序、汇编指令运算，所以相同的代码，结果也是不能预测的” [quote=引用 2 楼 user-7 的回复:] 简单地说，浮点数无法精确表示4.01，只能表示成4.010000001或者4.009999999 上面这两个数只是距离，准确的说，浮点数无法精确表示任何“不等于2的-n次方的整数倍的小数”[/quote] 个人感觉最好看一下汇编代码，看看着两个句子在你的编译器中生成的汇编代码又什么不同。

user: user-0
content: 那printf("%d\n",b);     printf("%d\n",(int)(4.01*100)); 这两句的结果感性来讲应该是结果相同的吧，结果不同也有点费解，这是不是因为5楼最后一句说的呢——“......这种误差无法预测，不同的编译器，或者不同的机器环境，使用不同的运算顺序、汇编指令运算，所以相同的代码，结果也是不能预测的” 引用 2 楼 user-7 的回复:简单地说，浮点数无法精确表示4.01，只能表示成4.010000001或者4.009999999 上面这两个数只是距离，准确的说，浮点数无法精确表示任何“不等于2的-n次方的整数倍的小数”

user: user-0
content: 哦，我用的是codeblocks下的mingw，系统是32位的。 引用 3 楼 zxh707wk 的回复:gcc编译都是401的说。。。

user: user-0
content: 我用的是codeblocks下的mingw，系统是32位的。  引用 1 楼 zjq9931 的回复:用的什么编译器？我用的VC6都是401啊？你用的64位的编译器？ [quote=引用 楼主 BensonLaur 的回复:] #include<stdio.h> int main() {     double a=4.01;     int b;     b=a*100;     printf("%d\n",b);     printf("%d\n",(int)(4.01*100));  } 输出的结果是： 400 401  谁知道这是什么原因呀，有人说是因为“浮点误差”，并在表达式 b=a*100;上边加了 1e-7 (1的-7次方) 就解决了误差问题了，也就是赋值的那一句改为 b=a*100+1e-7,  结果就是了： 401 401  可我还是不知道为什么呀，哪位能够说个具体缘由来么 [/quote]

user: user-2
content: 浮点数在计算机中无法精确存储，比如说你放到变量里的是20.000000，它就可能是20.000001或19.99999什么的，总之一般都不会精确存储

user: user-3
content: #include <stdio.h>  int main() {     float a = 4.01;     int b;     b = a * 100;     printf("%d\n",b);     printf("%d\n",(int)(4.01 * 100));     return 0; }   double只是近似值

user: user-4
content: 不要拿整数和浮点数直接运算，应该都转换成浮点数，最后四舍五入得到整数。  浮点误差主要是两个，一个是二进制数无法表示某些十进制数表示有限小数的数。好比3进制的1.1，相当于十进制的4/3，十进制就没法用有限小数表示。另一个是浮点数计算本身有误差，单精度浮点数运算大致只能取7位有效小数，而且多次运算会丢失更多精度。最后，这种误差无法预测，不同的编译器，或者不同的机器环境，使用不同的运算顺序、汇编指令运算，所以相同的代码，结果也是不能预测的。

user: user-5
content: 同意二楼，浮点数本来就不能精确存储

user: user-6
content: gcc编译都是401的说。。。

user: user-7
content: 简单地说，浮点数无法精确表示4.01，只能表示成4.010000001或者4.009999999 上面这两个数只是距离，准确的说，浮点数无法精确表示任何“不等于2的-n次方的整数倍的小数”

user: user-1
content: 用的什么编译器？我用的VC6都是401啊？你用的64位的编译器？ 引用 楼主 BensonLaur 的回复:#include<stdio.h> int main() {     double a=4.01;     int b;     b=a*100;     printf("%d\n",b);     printf("%d\n",(int)(4.01*100));  } 输出的结果是： 400 401  谁知道这是什么原因呀，有人说是因为“浮点误差”，并在表达式 b=a*100;上边加了 1e-7 (1的-7次方) 就解决了误差问题了，也就是赋值的那一句改为 b=a*100+1e-7,  结果就是了： 401 401  可我还是不知道为什么呀，哪位能够说个具体缘由来么