C# 使用带float的cast和parse时接收完全不同的答案
我正在学习用C#编写代码,因为我喜欢这门语言所能提供的东西,在一次学习练习中,我遇到了一个问题 练习的要点是学习声明变量、使用变量和显示变量 我的代码是这样运行的:C# 使用带float的cast和parse时接收完全不同的答案,c#,parsing,casting,console.readline,C#,Parsing,Casting,Console.readline,我正在学习用C#编写代码,因为我喜欢这门语言所能提供的东西,在一次学习练习中,我遇到了一个问题 练习的要点是学习声明变量、使用变量和显示变量 我的代码是这样运行的: //Declare variables float originalFahrenheit; float calculatedFahrenheit; float calculatedCelsius; //Asks for fahrenheit Conso
//Declare variables
float originalFahrenheit;
float calculatedFahrenheit;
float calculatedCelsius;
//Asks for fahrenheit
Console.Write("Enter temperature in fahrenheit: ");
originalFahrenheit = float.Parse(Console.ReadLine());
//Calculations
calculatedCelsius = ((originalFahrenheit - 32) / 9) * 5;
calculatedFahrenheit = ((calculatedCelsius * 9) / 5) + 32;
//Display calculations
Console.WriteLine(originalFahrenheit + " degrees fahrenheit is " + calculatedCelsius + " degrees celsius");
Console.WriteLine(calculatedCelsius + " degrees celsius is " + calculatedFahrenheit + " degrees fahrenheit");
Console.ReadKey();
当用户输入“70”华氏度时,正确显示答案
输入华氏温度:70
70华氏度是21.11111摄氏度
21.11111摄氏度是70华氏度
现在,我尝试使用“casting”,只是因为编译了代码,但结果不同:
代码如下:
//Asks for fahrenheit
Console.Write("Enter temperature in fahrenheit: ");
originalFahrenheit = (float)Console.Read;
这就是我得到的答案:
输入华氏温度:70
55华氏度是12.77778摄氏度
12.77778摄氏度是55华氏度
我想知道为什么会这样。在这种情况下,强制转换是不好,还是我的语法不好
请再问一个问题。更改时:
originalFahrenheit = float.Parse(Console.ReadLine());
originalFahrenheit=(浮动)控制台。读取
到
我有个例外。请看下图:
它基本上告诉我不能将类型“string”转换为“float”
更改时:
originalFahrenheit = float.Parse(Console.ReadLine());
到
我还有一个例外。请看下面:
异常告诉我无法将类型“int”转换为“string”
为什么会这样?“ReadLine”和“Read”在代码中是如何发挥作用的?C#不允许从字符串
转换为浮动
。必须使用Float.Parse()
显式执行此类操作
代码读取55度的原因是Console.Read()
从输入流读取下一个字符。该字符被简单地编码为整数,因此这里允许强制转换,您不会得到异常。此外,如果您检查ASCII表(例如这里),您将看到7(您的第一个字符)编码为55
您的下一篇文章在Console.ReadLine()
中引发异常的原因是该函数返回一个字符串(输入流中所有字符的字符串,直到下一个新行字符)。在这种情况下,正如我们之前确定的,C#不允许铸造
Float.Parse(Console.Read())
并不完全有意义,因为Float.Parse
需要一个字符串,但正如上面指出的那样,Console.Read()
返回一个int
有关更多信息,请参阅MSDN中的以下参考资料:
,Console.Read返回一个整数,该整数表示键入的单个字符的代码。(您可以在55值中看到它,因为这是字符“7”的ASCII码)要读取整个“70”号码,您需要两次调用才能读取。使用Console.ReadLineOh。我现在明白为什么55出现了。那么“不能将int转换为string”呢?使用“float.Parse(Console.Read())”?如果因为我使用了“read”,所以程序只能读取“7”,为什么它会告诉我不能将int转换为string?我真的希望大家能理解我的意思。如果系统不支持cast,或者您已经为它编写了一个脚本,那么就不能使用cast。现在支持将int转换为float(读案例),不支持将字符串转换为float(ReadLine)。最后一个问题(float.Parse)是错误的,因为Parse需要一个字符串,而您需要传递一个整数。我还应该补充一点,使用float.Parse转换float变量中的用户输入是非常危险的。如果用户键入的不是有效的浮点数,代码将抛出异常(请尝试输入“ABC”并查看)。解析用户输入时始终使用float.TryParse是一个很好的实践。真的吗?谢谢你的提示!
originalFahrenheit = float.Parse(Console.Read());