このコードでは、コメントした行で上記のエラーが発生しました。
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;
}
}
何が問題なのですか?ありがとう!
Math.Pow
メソッドはdouble
ではなくlong
を返すため、これを考慮してコードを変更する必要があります。
x = (long)(u % Math.Pow(10, m));
このコードは、Math.Pow
からdouble
の結果をキャストし、その値をx
に割り当てます。 decimal
(浮動小数点型であり、10進値を表すことができます)によって提供されるすべての精度が失われることに注意してください。 long
にキャストすると、小数点以下のすべてが切り捨てられます。
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
さらに、ゼロ除算して宇宙を破壊する可能性があります。
タイプを変更する
long x;
long y;
long w;
long z;
に
double x;
double y;
double w;
double z;
または利用する
Convert.ToInt64
Math.Powはdoubleを返します。たとえば、明示的にlongにキャストできます
x = u % (long)Math.Pow(10, m);
それはおそらく正しい解決策ではありませんが。あなたが求めている結果は、ダブルとして適切に表現できると確信していますか?そうでない場合は、longではなくdoubleとして宣言される変数を変更します。
暗黙的にdoubleからlongにキャストしたり、(long)キャストを使用したり、変数宣言の型をdoubleに変更したりすることはできません。