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 to
float
。如果程序员在这里犯了这个错误而没有注意到float和double之间的区别,我想这并不重要。@Joey:Casting to
float
打开了异常之门。如果OP要求最终结果适合于
浮点
,则这可以是解决方案的一部分,但不能单独使用。需要额外的“如果不合适怎么办”逻辑。Jon,有什么例外?如果它不适合,它将被钳制在无穷大或0。记住,我们这里讲的是浮点型,而不是整数类型。另外,看看OP发布的课程。你真的希望他们尝试使用
1e200
左右的数字,而不是
25
左右的数字吗?@Joey:关于例外情况,你是对的(正如在中所述,这个特定演员阵容将没有例外)。我不希望OP会这么做。但是为什么要使用一个隐藏陷阱的解决方案呢?