2017-09-28 34 views
1

我正在用C编写一个非常基本的程序(对C来说是新东西,所以只需要掌握一些东西),而且我正在为TypeCasting而努力。为什么我需要在此处指定所有值?

这是一个简单的计算程序,它允许你输入两个数字并决定你想要对它们做什么(加,减,除,乘)。显然,并非所有的数字都可以被所有其他数字整除,所以在我的switch语句中,我试图将int转换为float。

按照要求,我的变量声明在这里:

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语句,我可以只使用一个浮动的,而不是用原来的整数传开,但我已经做了这个代码试着更好地理解类型转换,并且在不需要对所有东西进行类型转换的情况下都能够工作。任何人都可以照耀一些光明?我的讲师在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

不是答案,但请注意'(float)something = something' [在标准C中无效](http://coliru.stacked-crooked.com/a/e99279b49f399697)。 – HolyBlackCat

+0

您的变量的声明丢失。请出示[MCVE]。你确定'inputOne'和'inputTwo'包含你期望的值吗? –

+0

答案完全取决于'inputOne'和'inputTwo'是如何声明的。他们是“int”还是“double”,或者是什么? –

回答

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进行打印,可以考虑使用double数学用于所有典型FP操作并保留float空间/速度的选择用途。

double calculatedValue = (double)inputOne/inputTwo; // better yet 
printf("%.2f", calculatedValue); 

一般情况下,避免铸造。它倾向于隐藏问题。替代方案:

double calculatedValue = 1.0 * inputOne/inputTwo; 
// or 
double calculatedValue = inputOne; 
calculatedValue /= inputTwo; 

注意在%1.2f"1无济于事。 1是打印号码的指定最小宽度,并且一个数字总是打印出至少1个字符。由于".2"部分的原因,%1.2f"将始终打印出至少4个字符。 考虑%.2f"

+0

完美,很棒的答案谢谢。 calvulatedValue,inputOne和inputTwo都被声明为int。你能解释一下为什么下面这些工作可行吗?这是因为它将int转换为float还是操作数? printf(“%s%d%s%d%s%1.2f”,“value的值”,inputOne,“除以”,inputTwo,“等于”,(float)calculatedValue =(float)inputOne /(浮动)inputTwo); –

+0

@MitchellWelch'(float)calculatedValue = ...'中的'(float)calculatedValue'不是有效的C代码。也许你正在使用一些带有语言扩展或者另一种语言的C编译器(C++?IDK) – chux

+0

@MitchellWelch请注意,当我们到达答案的结尾时,chux假设'caluclatedValue'是一个'float'或一个'double'。如果'calculatedValue'是一个'int',这个解决方案将* not *工作。 –

2

您的问题是分部本身。

划分两个int s产生另一个int。由于它是int,因此不可能有小数。

铸造intfloat不能神奇地重新引入它从来没有的小数。

您需要将操作数中的任意一个操作到float,以便该部门本身不生成int。你不需要任何其他演员。

+1

他们还需要确保'calculateValue'实际上被声明为float或double。 – zwol

+0

嗨。我只是将更改后的代码添加到原始帖子中,但它不起作用。这是因为calculateValue被设置为int吗?试图了解如何在这种情况下正确使用类型转换。 –

+0

@MitchellWelch如果'calculatedValue'被声明为'int',那么你永远不会得到浮点结果。你真的需要告诉我们你的变量是如何声明的;它使所有的差异。 –

1

您必须决定是否为整数值或浮点值编写计算器。

如果您正在为整数值编写计算器,则不需要任何强制转换。当你写

calculatedValue = inputOne/inputTwo; 

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

如果你想为浮点值计算器,你最好的赌注将是申报inputOneinputTwocalculatedResult所有为double。在这种情况下,你仍然不需要任何类型转换,因为现在,当你写

calculatedValue = inputOne/inputTwo; 

你会得到浮点除法和浮点结果。

正如其他人所解释的,如果出于某种原因,你有inputOneinputTwo为整数,但你想有一个浮点结果,你将不得不宣布calculatedResultdouble,写

calculatedResult = (doiuble)inputOne/inputTwo; 

你” ve也询问了关于该行

printf("%s%d%s%d%s%1.2f", "The value of ", inputOne, " divided by ", inputTwo, " is equal to ", (float)calculatedValue = (float)inputOne/(float)inputTwo); 

并声称它以某种方式工作。但这不是C,所以我们不能解释它。 (是什么编译您使用?)在C语言中,表达

(float)calculatedValue = (float)inputOne/(float)inputTwo 

是非法的,因为左侧

(float)calculatedValue 

是一个右值,并且是不可转让。

+0

嗯,可能是这种情况(如果我使用了错误的编译器,从字面上使用大学告诉我使用的那个编译器,可能会感到困惑)。我的编译器是安装了C++东西的Visual Studio Basic,但我们将文件重命名为.c而不是.cpp。也许这是我的困惑? –

+0

我刚刚注意到你说这是一个右值,这意味着它不可赋值......但它是可赋值的,因为我可以给它赋值。如果我将它的声明更改为float而不是int,那么这可以在没有类型转换的情况下进行赋值。 –

+0

@MitchellWelch我告诉你它不能在C **中分配**。说它是可分配的,因为你可以分配它,就像说你可以从加油站偷钱,因为你曾尝试过一次并逃脱了它。你的编译器有扩展(他们都这样做),这意味着它编译Visual Studio sorta-C,而不是标准的,可移植的C.如果你想用C解决你的问题,我们可以帮助你。如果你想继续使用'(float)calculatedValue = something',或者理解它是如何工作的,我们不能。 –

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(记住,无论inputOneinputTwoint S),所以基本上你还是分配int!值3float变量calculatedValue

为了得到预期的结果,你可以这样做:

float inputOne = 10, float = 3; 
float calculatedValue; 
calculatedValue = inputOne/inputTwo; 

所有变量是float类型,则expresion inputOne/inputTwo将是一个floatcalculatedValue最终将包含3.33333。

int inputOne = 10, float = 3; 
float calculatedValue; 
calculatedValue = (float)inputOne/inputTwo; 

这里表达(float)inputOne/inputTwo是float类型(我们通过int划分float),并再次yo'ill得到预期的结果。

相关问题