#include <stdio.h>
int main( )
{
float a=1.0;
long i;
for(i=0; i<100; i++)
{
a = a - 0.01;
}
printf("%e\n",a);
}
结果是:6.59e-07
答案 0 :(得分:11)
这是一个二进制浮点数,而不是十进制数 - 因此您需要预期舍入错误。请参阅本文中的基本部分:
<强> What Every Programmer Should Know About Floating-Point Arithmetic 强>
例如,值0.01在二进制浮点类型中没有精确的表示。要在样本中获得“正确”结果,您必须舍入或使用十进制浮点类型(请参阅Wikipedia):
二进制定点类型是最常用的,因为重新缩放操作可以实现为快速位移。二进制定点数可以精确地表示两个的分数幂,但是,像二进制浮点数一样,不能精确地表示十的分数幂。如果需要精确的十分之一幂,则应使用十进制格式。例如,十分之一(0.1)和百分之一(0.01)只能通过二进制定点或二进制浮点表示来近似表示,而它们可以精确地表示为十进制定点或十进制浮点表示。这些表示可以以多种方式编码,包括BCD。
答案 1 :(得分:3)
这里有两个问题。如果您问,为什么我的printf语句将结果显示为6.59e-07
而不是0.000000659
,这是因为您已使用format specifier表示科学记数法:%e
。您希望%f
用于浮点a
。
printf("%f\n",a);
如果你问为什么结果不是完全为零而不是0.000000659
,答案是(正如其他人已经指出的那样)使用二进制数进行浮点运算需要进行舍入。
答案 2 :(得分:1)
您必须指定%f来打印浮点数,然后它将为变量a打印0。
答案 3 :(得分:0)
这是浮点数在场景中舍入错误。每次减去一个分数时,你得到的结果大致是你通常从纸上数字得到的结果,因此最终结果非常接近零,但不一定是精确的零。
答案 4 :(得分:0)
浮点数的精度不准确,这就是你找到这个结果的原因。
亲切