C语言 我正在创建一个程序,将总年数转换为十年和年,我的输出之一是有点奇怪[复制]

rvpgvaaj  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(105)

此问题在此处已有答案

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年。

我不明白为何会发生这种情况。

qmelpv7a

qmelpv7a1#

浮点数是不精确的。像2.6和3.3这样的值不能精确地用二进制浮点数表示。结果得到的值不是稍大就是稍小。
我们看到的是后一种情况,3.4的存储格式大约是3.3999999999999999991,减去3再乘以10得到3.99999999999999999991,然后将其转换为int,小数部分被截断,得到3。
也就是说,这里不需要浮点运算,可以使用取模运算符%来得到除以10的余数。

tempVal.yearsVal = totalYears%10;

相关问题