这里有两份代码,变量的数据类型不同,运行出来的结果不一样,使用double算出来的麦子粒数比int型的要大1,想知道是什么原因造成的,不知道和printf()这个函数有没有关系
```c
#include<stdio.h>
#include<math.h>
int main()
{
long double sum = 0;
long double temp;
long double weight;
int i;
for (i=0; i < 64; i++)
{
temp = pow(2, i);
sum = sum + temp;
}
weight = sum / 25000;
printf("舍罕王应该给予达依尔%.f粒麦子!\n", sum);
printf("如果每25000粒麦子为1kg,那么应该给%.f公斤麦子!\n", weight);
return 0;
}
结果如图:
```c
#include <stdio.h>
#include <math.h>
int main()
{
unsigned long long sum = 0;
unsigned long long temp;
unsigned long long weight;
int i;
for (i=0; i < 64; i++)
{
temp = pow(2, i);
sum = sum + temp;
}
weight = sum / 25000;
printf("舍罕王应该给予达依尔%llu粒麦子!\n", sum);
printf("如果每25000粒麦子为1kg,那么应该给%llu公斤麦子!\n", weight);
return 0;
}
结果如图:
第一个肯定是错的啦,2^0 = 1,结果肯定是奇数。
主要是精度的问题,long double 保证的有效位数是 18-19,再大就有可能出错了(不代表绝对会出错)。
另外 long double 使用 %Lf 打印(和编译器有关)