在这段代码中,我在评论的行中得到了上述错误。
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 < i.Length; counter++)
{
nums[counter] = Convert.ToInt32(i[counter]);
}
u = nums[0];
int firstdigits = Convert.ToInt32(Math.Floor(Math.Log10(u) + 1));
v = nums[1];
int seconddigits = Convert.ToInt32(Math.Floor(Math.Log10(v) + 1));
if (firstdigits >= 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;
}
}
问题是什么?谢谢!
答案 0 :(得分:17)
Math.Pow
方法返回double
,而不是long
,因此您需要更改代码以解决此问题:
x = (long)(u % Math.Pow(10, m));
此代码将转换double
的{{1}}结果,并将该值分配给Math.Pow
。请记住,您将失去x
提供的所有精度(这是一种浮点类型,可以表示十进制值)。转换为decimal
将截断小数点后的所有内容。
答案 1 :(得分:5)
Math.Pow返回一个双精度。
%的右侧(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
此外,您可以将零除以并破坏宇宙。
答案 2 :(得分:3)
Math.Pow返回一个double。您可以明确地转换为long,例如
x = u % (long)Math.Pow(10, m);
虽然这可能不是正确的解决方案。您确定您所追求的结果可以正确表达为双倍吗?如果没有,则将变量声明为双精度而不是长整数。
答案 3 :(得分:2)
更改类型
long x;
long y;
long w;
long z;
到
double x;
double y;
double w;
double z;
或者使用
Convert.ToInt64
答案 4 :(得分:2)
你不能'将隐式double转换为long,使用(long)强制转换或更改变量声明的类型加倍。
答案 5 :(得分:1)