新手学习C语言,所有的数学计算都稍微有些偏差。

8

我正在一门编程课上,我们刚刚从Python转到了C。我对它有点困难,因为C似乎不像Python那样轻松地执行数学运算,或者在处理C中的数学时我可能遗漏了些东西。

我的作业要求编写一个程序,收集用户车辆每加仑可行驶里程、每加仑油费以及他们每月行驶的里程数。然后程序会告诉他们本月可以预期的油费支出。我的当前代码如下:

#include <stdio.h>

int main () {

int mpg, miles;
double gas_price;

printf("How many miles per gallon does your car get?\n");
scanf("%d", &mpg);

printf("What is the price of gasoline per gallon?\n");
scanf("%lf", &gas_price);

printf("How many miles do you drive in a month?\n");
scanf("%d", &miles);

printf("The cost of gas this month is $%.2lf\n", miles / mpg * gas_price);

printf("%d %d %d", mpg, gas_price, miles);

return 0;
}

当我使用24作为“mpg”的值,3.00作为“gas_price”的值,以及1000英里的行驶距离运行程序时,总费用为123美元。这是不正确的,比实际价格少约两美元。当你使用((1000 / 24) * 3.00)时,应该得到125美元。我添加了一个字符串来打印出所有的数值,查看C语言在第23行的公式中使用的内容,尽管“mpg”和“gas_price”是正确的,“miles”显示的值为1,074,266,112。我知道这里一定有错误,因为这将使结果偏差远超过2美元,但我不能不认为它与此有关。
对于问题的长度我深感歉意,但我想尽可能具体,并且我完全不知道为什么C语言读取它如此奇怪。

这就是如何写出清晰的问题 - 做得好。 - YXD
4个回答

14

这里进行的是整数除法:

miles / mpg * gas_price

首先将两个操作数中的一个转换为 double 类型:

(double)miles / mpg * gas_price

整数除法会截断小数部分。这就是为什么你的数字会出错。


你还有另一个错误:

printf("%d %d %d", mpg, gas_price, miles);

您的printf格式说明符不匹配操作数。 应该是:

printf("%d %f %d", mpg, gas_price, miles);

4

这个表达式:

miles / mpg * gas_price

被解析为

(miles / mpg) * gas_price

在乘法之前进行除法运算。除法的两个操作数都是整数,因此C会给出一个整数(截断)结果。为了强制将其转换为浮点数计算,请执行以下操作:

1.0 * miles / mpg * gas_price

1

int mpg, miles; 更改为 double mpg, miles;。问题在于 miles/mpg 使用整数除法,导致结果为 41 而不是 41.66....


0

对于 miles / mpg 的整数除法会丢失一些精度。同时在你的最后一行中,printf 格式说明符不匹配 - 在打印 gas_price 时,应该使用 %f 或类似的格式说明符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接