此问题在此处已有答案:
Why are floating point numbers inaccurate?(5个答案)
19天前关闭。
#include <stdio.h>
typedef struct ElapsedTime_struct {
int decadesVal;
int yearsVal;
} ElapsedTime;
ElapsedTime ConvertToDecadesAndYears(int totalYears) {
ElapsedTime tempVal;
tempVal.decadesVal = totalYears/10;
tempVal.yearsVal = (((double) totalYears/10) - tempVal.decadesVal) * 10;
return tempVal;
}
int main(void) {
ElapsedTime elapsedYears;
int totalYears;
scanf("%d", &totalYears);
elapsedYears = ConvertToDecadesAndYears(totalYears);
printf("%d decades and %d years\n", elapsedYears.decadesVal, elapsedYears.yearsVal);
return 0;
}
我的逻辑是,如果你把总年数(26)除以10,你会得到十年数。int(26/10)= 2
我对年数的逻辑是,如果你取26/10的两倍值,你将得到2.6000
然后减去2.6 - 2(十年数),得到年数的十进制值(0.6)
然后乘以10得到一个整数值(6),所以总共是20年和6年。
然而,当我尝试运行一些输入的代码(总共34年)时,由于某种原因,我得到了30年和3年,而我应该得到30年和4年。
我不明白为何会发生这种情况。
1条答案
按热度按时间qmelpv7a1#
浮点数是不精确的。像2.6和3.3这样的值不能精确地用二进制浮点数表示。结果得到的值不是稍大就是稍小。
我们看到的是后一种情况,3.4的存储格式大约是3.3999999999999999991,减去3再乘以10得到3.99999999999999999991,然后将其转换为
int
,小数部分被截断,得到3。也就是说,这里不需要浮点运算,可以使用取模运算符
%
来得到除以10的余数。