我正在用C编写一个非常基本的程序(对C来说是新的,所以只是搞定了事情)我正在努力使用TypeCasting。
这是一个简单的计算程序,它允许您输入两个数字并决定您要对它们做什么(加,减,除和乘)。显然,并非所有数字都可以被所有其他数字整除,因此在我的switch语句中,我试图将int类型转换为浮点数。
根据要求,我的变量声明在这里:
int inputOne, inputTwo, calculatedValue = 0;
char calcType;
char restart = 'n';
我已经通过将所有价值观进行了规范来实现这一目标,但以下是我之前尝试的内容:
case 'd': case 'D':
calculatedValue = inputOne / inputTwo;
printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue);
printf("\nPlease note: This is only accurate to two decimal places.");
break;
这只返回4而没有任何小数位。然后我想也许是因为计算仍然在int中,所以我将其更改为:
case 'd': case 'D':
(float)calculatedValue = inputOne / inputTwo;
printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue);
printf("\nPlease note: This is only accurate to two decimal places.");
break;
但这只返回1082130432.00。不知道那个号码来自哪里。
我用它来解决这个问题:
case 'd': case 'D':
printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue = (float)inputOne / (float)inputTwo);
printf("\nPlease note: This is only accurate to two decimal places.");
break;
因为它在switch语句中,我可以通过使用float而不是原始整数来解决这个问题,但是我已经完成了这个代码来尝试更好地理解类型转换,并且在没有它的情况下它可以工作不得不强调一切。任何人都能发光吗?我的讲师在printf中使用了类型转换,它运行良好。在他的例子中,他试图找到学生的平均年龄,他这样做:
printf("\nAverage age: %1.2f", (cAge1 + cAge2 + cAge3) / (float)cNumStudents);
希望这对于一个简单的问题来说是有道理和抱歉的,我只是想了解为什么我必须对所有内容进行类型转换(因为我的讲师说你只需要做一个值)。
干杯
编辑:
我刚刚尝试了以下但它返回0.00,而不是答案。
calculatedValue = (float)inputOne / inputTwo;
printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", calculatedValue);
printf("\nPlease note: This is only accurate to two decimal places.");
break;
答案 0 :(得分:2)
你的问题就是分裂本身。
划分两个int
会产生另一个int
。由于它是int
,因此无法使用小数。
将int
投射到float
无法神奇地重新引入它从未有过的小数。
您需要将任一操作数强制转换为float
,以便除法本身不会产生int
。你不需要任何其他演员阵容。
答案 1 :(得分:1)
int inputOne, inputTwo;
calculatedValue = (float)inputOne / inputTwo;
演员表不是需要 - 有替代方案,但使用来确保除法是用浮点数学而不是整数数学计算的。
然而,这只是需要审核的一个步骤:calculatedValue
的类型是什么?如果这也是int
,则float
商将转换回int
。然后FP部门没用了。
int calculatedValue = (float)inputOne / inputTwo; // poor code
而是使用浮点(FP)类型
float calculatedValue = (float)inputOne / inputTwo; // better
由于calculatedValue
作为float
被转换为double
进行打印,因此请考虑对所有典型的FP操作使用double
数学并保留float
适用于空间/速度的选择。
double calculatedValue = (double)inputOne / inputTwo; // better yet
printf("%.2f", calculatedValue);
一般情况下,避免施法。它往往会隐藏问题。备选方案:
double calculatedValue = 1.0 * inputOne / inputTwo;
// or
double calculatedValue = inputOne;
calculatedValue /= inputTwo;
请注意1
中的%1.2f"
没有任何意义。 1
是指定的打印数字的最小宽度,并且始终打印出至少包含1个字符的数字。由于%1.2f"
部分,".2"
将始终打印出至少4个字符。
考虑%.2f"
。
答案 2 :(得分:1)
您必须决定是否为整数值或浮点值编写计算器。
如果您正在为整数值编写计算器,则不需要任何演员表。当你写
calculatedValue = inputOne / inputTwo;
你会得到一个整数结果,余数被丢弃,但这只是一个整数计算器的合适结果。
如果您想要一个浮点值计算器,最好的方法是将inputOne
,inputTwo
和calculatedResult
全部声明为double
。在这种情况下,你仍然不需要任何演员阵容,因为现在,当你写作
calculatedValue = inputOne / inputTwo;
您将获得浮点除法和浮点结果。
正如其他人所解释的那样,如果出于某种原因,您有inputOne
和inputTwo
作为整数,但是您想要一个浮点结果,则必须将calculatedResult
声明为{{ 1}},然后写
double
您还询问了该行
calculatedResult = (doiuble)inputOne / inputTwo;
并声称它以某种方式起作用。但这不是C,所以我们无法解释。 (你使用什么编译器?)在C中,表达式
printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue = (float)inputOne / (float)inputTwo);
是非法的,因为左手边
(float)calculatedValue = (float)inputOne / (float)inputTwo
是一个右值,不可分配。
答案 3 :(得分:0)
您的计划中有问题的部分归结为:
int inputOne = 10, inputTwo = 3, calculatedValue;
calculatedValue = inputOne / inputTwo;
calculatedValue
是int
,因此它不能包含小数部分。因此,此处calculatedValue
在分割后包含3
。
现在,如果您使用printf("%f", (float)calculatedValue)
进行打印,则会得到3.000000
的输出,因为(float)
强制转换只会转换calculatedValue
中的整数值(= 3)到float
(= 3.0)。
为了获得预期的结果,您可能想要这样做:
int inputOne = 10, inputTwo = 3;
float calculatedValue;
calculatedValue = inputOne / inputTwo;
但calculatedValue
再次包含3.0
而不是预期的3.33333
。
现在问题是表达式inputOne / inputTwo
是int
,其值为3
(请记住,inputOne
和inputTwo
都是int
s ),所以基本上你仍然分配int
!值3
到float
变量calculatedValue
。
为了获得预期的结果,您可以这样做:
float inputOne = 10, float = 3;
float calculatedValue;
calculatedValue = inputOne / inputTwo;
所有变量属于float
类型,表达式inputOne / inputTwo
将为float
,而calculatedValue
最终将包含3.33333。
int inputOne = 10, float = 3;
float calculatedValue;
calculatedValue = (float)inputOne / inputTwo;
此处表达式(float)inputOne / inputTwo
的类型为float(我们将float
除以int
),然后再次得到预期的结果。