おそらく、オペランドが整数であるためです。
整数間で演算を実行すると、結果は別の整数になります (これが「丸められる」理由です)。あなたの場合、操作が実行された後、結果は double にキャストされます (したがって、整数の結果は double に変換されます)。結果が double になるように、double 間で操作を実行する必要があります。これは、除算に関係する変数の 1 つの型を double に変更するだけで実行できます (たとえば、b1、a22、a11、b2、または a12): 他の変数は自動的に double に昇格されます。
コード例:
double b1 = /* whatever */;
// ..
if (((a11*a22)-(a12*a21))!=0) {
double sol1 = (b1*a22-b2*a12) / (a11*a22-a12*a21);
double sol2 = (b2*a11-b1*a21) / (a11*a22-a12*a21);
System.out.println("Single solution: ("+sol1+", "+sol2 +")");
}
または、変数の型を double にしたくない場合は、分子または分母 (またはその両方) をキャストできますが、違いはありません:
if (((a11*a22)-(a12*a21))!=0) {
double sol1 = (double)(b1*a22-b2*a12) / (a11*a22-a12*a21);
double sol2 = (b2*a11-b1*a21) / (double)(a11*a22-a12*a21);
System.out.println("Single solution: ("+sol1+", "+sol2 +")");
}
また、分子 (または分母) の計算に関与する変数のいずれかが double の場合、分子全体が double に「変換」されるため、除算の結果は double になります (分子または分母の少なくとも 1 つが double であるため)。 )。ただし、次のようなコードがあるとします。
if (((a11*a22)-(a12*a21))!=0) {
double sol1 = (double)someOtherIntVariable + (b1*a22-b2*a12) / (a11*a22-a12*a21);
//...
}
除算はint変数間で実行され、次にdouble変数が追加されるため、機能しません。これには、現在と同じ問題があります