无法隐式将“double”类型转换为“long”

在这段代码中,我在评论的行中得到了上述错误。

public double bigzarb(long u, long v) { double n; long x; long y; long w; long z; string[] i = textBox7.Text.Split(','); long[] nums = new long[i.Length]; for (int counter = 0; counter = seconddigits) { n = firstdigits; } else { n = seconddigits; } if (u == 0 || v == 0) { MessageBox.Show("the Multiply is 0"); } int intn = Convert.ToInt32(n); if (intn <= 3) { long uv = u * v; string struv = uv.ToString(); MessageBox.Show(struv); return uv; } else { int m =Convert.ToInt32(Math.Floor(n / 2)); x = u % Math.Pow(10, m); // here y = u / Math.Pow(10, m); // here w = v % Math.Pow(10, m); // here z = v / Math.Pow(10, m); // here long result = bigzarb(x, w) * Math.Pow(10, m) + (bigzarb(x, w) + bigzarb(w, y)) * Math.Pow(10, m) + bigzarb(y, z);///here textBox1.Text = result.ToString(); return result; } } 

什么是问题? 谢谢!

Math.Pow方法返回一个double ,而不是很long因此您需要更改代码以解决此问题:

 x = (long)(u % Math.Pow(10, m)); 

此代码将从Math.Pow double结果并将该值赋给x 。 请记住,您将失去由decimal所有精度(这是一个浮点类型,可以表示十进制值)。 转换为long会截断小数点后的所有内容。

Math.Pow返回一个double。

%的右侧(RHS)只能是整数类型。

你需要

 x = u % (long)Math.Pow(10, m);///<----here y = u / (long)Math.Pow(10, m);///here w = v % (long)Math.Pow(10, m);///here z = v / (long)Math.Pow(10, m);///here 

此外,您有可能将零除以并破坏宇宙。

Math.Pow返回一个double。 例如,您可以明确地转换为long

 x = u % (long)Math.Pow(10, m); 

虽然这可能不是正确的解决方案。 您确定您所追求的结果可以正确表达为双倍吗? 如果不是,则将变量声明为双精度而不是长整数。

改变类型

 long x; long y; long w; long z; 

 double x; double y; double w; double z; 

或者使用

 Convert.ToInt64 

你不能隐式地使用double to long,使用(long)强制转换或更改变量声明类型来加倍。

你也可以用这个:

 Convert.ToInt64( u % Math.Pow(10, m) ) 

来源于此