2011-10-20 70 views
3

我使用DEVC++ 4.9,在WinXP SP3(32位)上运行的,这里是代码:C中错误的双重计算?

#include <stdio.h> 
#include <stdlib.h> 

main(int argc, char *argv[]) 
{ 
    double value; 

    int i; 

    printf("Enter double: "); 
    scanf("%lf", &value); 
    i = value*100; 
    printf("double: %lf\n", value); 
    printf("int: %d\n", i); 

    system("PAUSE"); 
} 

我已经进入不同的价值观和这里的结果:

测试1:

enter image description here

试验2:

enter image description here

试验3:

enter image description here

为什么测试1和测试2显示不同的结果?

+1

我怀疑这只是一个特性,如何存储一个浮点数,以及它如何近似为一个整数。 –

回答

6

这是由于浮点四舍五入:

什么每台计算机科学家应该知道关于浮点运算: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

3.07不能以二进制精确表示。在你的情况下,它被四舍五入到略低于3.07,因此100 * 3.07正在评估对306.9999999...,其被截断为306

同样适用于3.05。但是3.06,略有增加。所以100 * 3.06正确显示为306.

+0

很好的解释和链接。谢谢。 – Alphaneo