web-dev-qa-db-ja.com

タイプ「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 < 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;
    }
}

何が問題なのですか?ありがとう!

14
Arash

Math.Powメソッドはdoubleではなくlongを返すため、これを考慮してコードを変更する必要があります。

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

このコードは、Math.Powからdoubleの結果をキャストし、その値をxに割り当てます。 decimal(浮動小数点型であり、10進値を表すことができます)によって提供されるすべての精度が失われることに注意してください。 longにキャストすると、小数点以下のすべてが切り捨てられます。

17
Andrew Hare

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

さらに、ゼロ除算して宇宙を破壊する可能性があります。

5
EnabrenTane

タイプを変更する

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

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

または利用する

Convert.ToInt64
3
Adriaan Stander

Math.Powはdoubleを返します。たとえば、明示的にlongにキャストできます

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

それはおそらく正しい解決策ではありませんが。あなたが求めている結果は、ダブルとして適切に表現できると確信していますか?そうでない場合は、longではなくdoubleとして宣言される変数を変更します。

3
John Pickup

暗黙的にdoubleからlongにキャストしたり、(long)キャストを使用したり、変数宣言の型をdoubleに変更したりすることはできません。

2
pyCoder

また、これを使用することができます:

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

ソース ここ

1
mayo