#include <stdio.h>
int main()
{
    float amounts[5];
    int dollars[5],cents[5];
    int i;
    for(i=0;i<=4;i++)
    {
        printf("Enter costs:\n");
        scanf("%f",&(amounts[i]));
        dollars[i]=(int)(amounts[i]/1);
        cents[i]=(int)((amounts[i]-dollars[i])*100);
        printf("$%d.%d\n",dollars[i],cents[i]);
    }
    return 0;
}

这是一个简单的代码。但是我在转换数据类型时发生了数据丢失。数据的丢失主要发生在取值为0.9/1.1/1.3/1.9/2.1/2.3/2.9/3.1/3.3。

其中1.1与2.1和3.1的数据变化最大。由0.1变成了0.9。这让我很不解。而其余的都是丢失0.01,这一点我自己试着解释,但是我的解释与现实情况还是有许多差异。

我先把我的解释放上:我想,假如在用浮点数据类型时,输入整数2,存储在计算机中的可能就是1.9999999...这样无限逼近于2的数据。然后又因为我把小数部分独立出来再乘以一个数值,转化成整形。这其中仍然剩余的小数部分就丢失了,然后数值夜跟着变小。

但我这种解释只能适应少部分情况,在大部分情况都不适用,比如说在小数点部分为偶的情况下,就明显不会发生数据丢失。

我现在很迷惑,不知有哪位高手可以帮我解下惑,我只是初学C语言,学校里教的又不深,希望有人能帮我详解一下数据丢失。