【问题标题】:Cannot implicitly convert type 'double' to 'long'无法将类型“double”隐式转换为“long”
【发布时间】:2010-12-20 13:01:12
【问题描述】:

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

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;
    }
}

有什么问题吗?谢谢!

【问题讨论】:

    标签: c# double long-integer


    【解决方案1】:

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

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

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

    【讨论】:

    • 投射时不要忘记溢出,这会完全搞砸。示例:(long) double.MaxValue == -9223372036854775808
    【解决方案2】:

    更改类型

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

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

    或者利用

    Convert.ToInt64
    

    【讨论】:

    • 这会解决它,但这是一个糟糕的解决方案,因为他选择 long 是有原因的,而 double 类型是最慢的类型,不将 Strings 算作一种类型。
    【解决方案3】:

    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
    

    另外,你有可能被零除并毁灭宇宙。

    【讨论】:

    • 从你的回答 % 的右手边 (RHS) 只能是整数类型,但是看着这个 msdn.microsoft.com/en-us/library/0w4e0fzs.aspx 我不同意...
    • 阅读您网站所说的这句话。注意 float 和 double 类型的错误。
    • 它指的是舍入错误,而不是编译/运行时错误。
    • 最好将取模运算的结果转换为long,而不仅仅是Math.Pow的结果。还要记住,如果编译器能够确定 uv 是浮点类型,那么您的代码仍然不会编译,因为表达式的结果仍然不能隐式转换为 long .最好转换整个表达式的结果(如我在回答中所示)以避免所有这些问题。
    【解决方案4】:

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

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

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

    【讨论】:

    • 虽然这是在使用从doublelong 的转换时应该考虑的一般情况,但我怀疑在这种特殊情况下m 总是足够小。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      你也可以使用这个:

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

      来源here

      【讨论】:

        猜你喜欢
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-18
        • 2020-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多