Невозможно неявно преобразовать тип '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;
}
}
В чем проблема? Спасибо!
Ответы
Ответ 1
Метод Math.Pow
возвращает double
, а не long
, поэтому вам нужно будет изменить свой код для учетной записи для этого:
x = (long)(u % Math.Pow(10, m));
Этот код выведет результат double
из Math.Pow
и присвоит это значение x
. Имейте в виду, что вы потеряете всю точность, обеспечиваемую decimal
(которая является типом с плавающей точкой и может представлять десятичные значения). Кастинг до long
будет усекать все после десятичной точки.
Ответ 2
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
Кроме того, у вас есть возможность деления на ноль и уничтожения юниверса.
Ответ 3
Math.Pow возвращает double. Вы можете явно использовать длинные, например
x = u % (long)Math.Pow(10, m);
хотя это, скорее всего, не правильное решение. Вы уверены, что результаты, которые вы после, могут быть правильно выражены как двойные? Если нет, измените переменные, которые будут объявлены как удвоенные, а не длинные.
Ответ 4
Изменить типы
long x;
long y;
long w;
long z;
к
double x;
double y;
double w;
double z;
Или используйте
Convert.ToInt64
Ответ 5
Вы не можете использовать неявно двойное, длинное, использовать (длинное) или изменить тип объявления переменной в double.
Ответ 6
Также вы можете использовать это:
Convert.ToInt64( u % Math.Pow(10, m) )
Источник здесь