为什么我需要在这里对所有值进行类型转换?

时间:2017-09-28 15:27:39

标签: c

我正在用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;

4 个答案:

答案 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;

你会得到一个整数结果,余数被丢弃,但这只是一个整数计算器的合适结果。

如果您想要一个浮点值计算器,最好的方法是将inputOneinputTwocalculatedResult全部声明为double。在这种情况下,你仍然不需要任何演员阵容,因为现在,当你写作

calculatedValue  = inputOne / inputTwo;

您将获得浮点除法和浮点结果。

正如其他人所解释的那样,如果出于某种原因,您有inputOneinputTwo作为整数,但是您想要一个浮点结果,则必须将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;

calculatedValueint,因此它不能包含小数部分。因此,此处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 / inputTwoint,其值为3(请记住,inputOneinputTwo都是int s ),所以基本上你仍然分配int!值3float变量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),然后再次得到预期的结果。