C# 无法隐式转换类型';双倍';至';长';

C# 无法隐式转换类型';双倍';至';长';,c#,double,long-integer,C#,Double,Long Integer,在这段代码中,我在注释的行中得到了上述错误 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.Leng

在这段代码中,我在注释的行中得到了上述错误

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;
    }
}
public-double-bigzarb(长u、长v)
{
双n;
长x;
长y;
长w;
长z;
字符串[]i=textBox7.Text.Split(',');
long[]nums=新长[i.长度];
用于(int计数器=0;计数器=第二位数)
{
n=第一位数字;
}
其他的
{
n=第二位数;
}
如果(u==0 | | v==0)
{
MessageBox.Show(“乘法为0”);
}
int intn=转换为32(n);
如果(intn改变类型

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

或者利用

Convert.ToInt64

数学。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

x=u%(long)Math.Pow(10,m);///方法返回一个
double
,而不是
long
,因此您需要更改代码以解决此问题:

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

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

您不能将双精度隐式转换为long,请使用(long)强制转换或将变量声明的类型更改为double。

Math.Pow返回双精度。例如,您可以显式转换为long

x = u % (long)Math.Pow(10, m);
虽然这可能不是正确的解决方案。您确定您所追求的结果可以正确地表示为双精度吗?如果不确定,则将变量更改为声明为双精度而不是长精度。

您也可以使用以下方法:

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

Source

这会解决问题,但这是一个糟糕的解决方案,因为他选择long是有原因的,而double-types是最慢的类型,不将字符串作为一个类型计算。从您的答案看,右边(RHS)of%只能是一个整数类型,但看这个我不同意…读一下你网站上说的这句话。注意类型float和double的错误。它指的是舍入错误,而不是编译/运行时错误。最好将模运算的结果转换为
long
,而不仅仅是Math.Pow
。还要记住,如果编译器能够计算出
u
v
是浮点类型,那么您的代码仍然不会编译,因为表达式的结果仍然不会隐式转换为
long
。最好转换整个表达式的结果(正如我在我的答案中所示)来避免所有这些问题。尽管这是一个普遍的问题,但是每当使用一个从<代码>双< /代码>到长的转换时,我认为在这个特殊的情况下,代码> M< /C>总是足够小的。在铸造时不要忘记溢出,这会把事情搞得一团糟。(长)double.MaxValue==-9223372036854775808
Convert.ToInt64( u % Math.Pow(10, m) )