Cannot implicitly convert type 'double' to 'long'

47,518

Solution 1

The Math.Pow method returns a double, not a long so you will need to change your code to account for this:

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

This code will cast the double result from Math.Pow and assign that value to x. Keep in mind that you will lose all the precision providided by decimal (which is a floating-point type and can represent decimal values). Casting to long will truncate everything after the decimal point.

Solution 2

Math.Pow returns a double.

the Right Hand Side (RHS) of % can only be an integer type.

you need

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

Additionally, You have the possibility of dividing by zero and destroying the universe.

Solution 3

Change types

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

to

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

Or make use of

Convert.ToInt64

Solution 4

Math.Pow returns a double. You could explicitly cast to long, for example

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

although that is likely not the correct solution. Are you certain that the results that you are after can be properly expressed as a double? If not then change the variables to be declared as doubles rather than longs.

Solution 5

You cant' cast implicitly double to long, use (long) cast or change type of variable declaration to double.

Share:
47,518
Arash
Author by

Arash

Email : arash_atafarin(at)yahoo[dot]com

Updated on July 09, 2022

Comments

  • Arash
    Arash almost 2 years

    In this code i got the above error in lines i commented.

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

    Whats is the problem? Thanks!