C# 数学.Pow给出了”的答案;无法隐式转换类型';双倍';至';浮动'&引用;错误
在这个程序中,我试图创建一个简单的计算器。然而,当到达C# 数学.Pow给出了”的答案;无法隐式转换类型';双倍';至';浮动'&引用;错误,c#,math,binary,C#,Math,Binary,在这个程序中,我试图创建一个简单的计算器。然而,当到达Math.Pow行时,我似乎找不到克服上述错误的方法 namespace BinaryCalc { class Binary { public static void Main() { int addition,subtraction; float division, multiplication, power, sqrt; int x;
Math.Pow
行时,我似乎找不到克服上述错误的方法
namespace BinaryCalc
{
class Binary
{
public static void Main()
{
int addition,subtraction;
float division, multiplication, power, sqrt;
int x;
int y;
x = 10;
y = 7;
//Console.WriteLine("Please enter a number for x");
//string line = Console.ReadLine();
//int x = int.Parse(line);
//Console.WriteLine("Please enter a number for y");
//string line2 = Console.ReadLine();
//int y = int.Parse(line2);
addition = (int)x + (int)y;
subtraction = (int)x - (int)y;
division = (float)x / (float)y;
multiplication = (float)x * (float)y;
power = Math.Pow(x,2);
sqrt = Math.Sqrt(x);
Console.WriteLine(" Addition results in {0}", addition);
Console.WriteLine(" Subtraction results in {0}", subtraction);
Console.WriteLine(" Division results in {0}", division);
Console.WriteLine(" Multiplication results in {0}", multiplication);
Console.WriteLine(" {0} squared results in {0}",x, power);
Console.WriteLine(" Square root of {0} is: {0}", x, sqrt);
}
}
}
Pow使用一个
double
参数。正如错误所说,没有从double
到float
的隐式转换,因此将结果显式转换为float:
power = (float)Math.Pow(x, 2);
编辑更正了转换顺序数学.Pow的返回值是一个
双精度。程序中的变量power
是一个float
,它具有较小的范围和精度
您应该将power
定义为double对变量使用double
而不是float
float
数据类型的精度非常有限,因此舍入误差(在浮点算术中总是存在)相对较大
之所以会看到平方和平方根的错误结果,是因为根本没有显示结果。将每个格式字符串中的一个{0}
更改为{1}
:
Console.WriteLine(" {0} squared results in {1}",x, power);
Console.WriteLine(" Square root of {0} is: {1}", x, sqrt);
您可以尝试显式地将Math.Pow的结果强制转换为float:
power = (float) Math.Pow(x, 2);
您还可以使用float的TryParse方法尝试解析Math.Pow的结果:
float.TryParse(Math.Pow(x, 2).ToString(), out power);
此外,您可能希望更改最后两个Console.WriteLine方法调用上的格式字符串参数编号。他们应该这样读:
Console.WriteLine(" {0} squared results in {1}",x, power);
Console.WriteLine(" Square root of {0} is: {1}", x, sqrt);
谢谢你的迅速回复。实际上我已经试过了,但是即使错误消失了,它也给了我一个错误的回答。包含平方根的下一行也是如此。@Alexandros:为什么不能将power
和sqrt
声明为double?问题不在于参数,而在于返回值-错误表示没有从double到float的转换,而不是从float到double的转换。@Alexandros:那是因为您使用了两次{0}
。第二个应该是{1}
非常感谢您的帮助。这确实是造成它的原因。我真是太傻了。用TryParse
来处理字符串肯定是疯了。我能理解为什么你认为TryParse不是最优的,但为什么也要投否决票?对不正确和/或有害的回答不投反对票吗?这是问题的有效答案(加上他在字符串格式方面的错误)。或者只需使用case tofloat
。如果程序员在这里犯了这个错误而没有注意到float和double之间的区别,我想这并不重要。@Joey:Casting tofloat
打开了异常之门。如果OP要求最终结果适合于浮点
,则这可以是解决方案的一部分,但不能单独使用。需要额外的“如果不合适怎么办”逻辑。Jon,有什么例外?如果它不适合,它将被钳制在无穷大或0。记住,我们这里讲的是浮点型,而不是整数类型。另外,看看OP发布的课程。你真的希望他们尝试使用1e200
左右的数字,而不是25
左右的数字吗?@Joey:关于例外情况,你是对的(正如在中所述,这个特定演员阵容将没有例外)。我不希望OP会这么做。但是为什么要使用一个隐藏陷阱的解决方案呢?