Java中的舍入问题

Java中的舍入问题,java,Java,我想用克拉默法则做一个快速的2变量方程求解器 但是由于某些原因,java不断地取整我的答案,所以我没有得到正确的答案 获得单一答案的基本规则是 ((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); 但是由于某种原因,我得到的是-4.0和4.0,而不是1,2,3,4,5,6的-

我想用克拉默法则做一个快速的2变量方程求解器 但是由于某些原因,java不断地取整我的答案,所以我没有得到正确的答案

获得单一答案的基本规则是

((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);
但是由于某种原因,我得到的是-4.0和4.0,而不是1,2,3,4,5,6的-4.0和4.5

如果有帮助,这就是问题代码:

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,如下所示:

   double sol1 = ((double)b1*a22-b2*a12) / (a11*a22-a12*a21);
   double sol2 = (b2*a11-b1*a21) / ((double)a11*a22-a12*a21);
或者将其中一个数字乘以1.0,使其成为十进制:

   double sol1 = (1.0*(b1*a22-b2*a12)) / (a11*a22-a12*a21);
   double sol2 = (b2*a11-b1*a21) / (1.0*(a11*a22-a12*a21));
这是必需的,因为当前它对
int
执行操作,并生成一个
int
,该值被分配到
double


将分子或任何参与变量乘以1.0或显式转换为double后,它将变为double和,然后剩余变量将自动升级为double,从而根据需要转换为
double
result

在操作之前显式转换任何变量为double,如下所示:

   double sol1 = ((double)b1*a22-b2*a12) / (a11*a22-a12*a21);
   double sol2 = (b2*a11-b1*a21) / ((double)a11*a22-a12*a21);
或者将其中一个数字乘以1.0,使其成为十进制:

   double sol1 = (1.0*(b1*a22-b2*a12)) / (a11*a22-a12*a21);
   double sol2 = (b2*a11-b1*a21) / (1.0*(a11*a22-a12*a21));
这是必需的,因为当前它对
int
执行操作,并生成一个
int
,该值被分配到
double


一旦将分子或任何参与变量乘以1.0或显式转换为double,它将变为double和,然后剩余变量将自动升级为double,从而根据需要转换为
double
result

请注意转换为double

if (((a11*a22)-(a12*a21))!=0) {
   double sol1 = (double)(b1*a22-b2*a12) / (a11*a22-a12*a21);
   double sol2 = (double)(b2*a11-b1*a21) / (a11*a22-a12*a21);
   System.out.println("Single solution: ("+sol1+", "+sol2 +")");
}

请注意将强制转换为双倍

if (((a11*a22)-(a12*a21))!=0) {
   double sol1 = (double)(b1*a22-b2*a12) / (a11*a22-a12*a21);
   double sol2 = (double)(b2*a11-b1*a21) / (a11*a22-a12*a21);
   System.out.println("Single solution: ("+sol1+", "+sol2 +")");
}

这可能是因为操作数是整数

当您在整数之间执行运算时,结果是另一个整数(这就是它被“舍入”的原因)。在您的情况下,在执行操作后,结果将强制转换为double(因此整数结果将转换为double)。您需要做的是在两倍之间执行运算,这样结果就是两倍。这可以通过简单地将除法中涉及的一个变量的类型更改为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)someOtherIntVariable + (b1*a22-b2*a12) / (a11*a22-a12*a21);
    //...
}

这是行不通的,因为除法是在int变量之间执行的,然后加上一个双变量。这与您现在遇到的问题相同,可能是因为操作数是整数

当您在整数之间执行运算时,结果是另一个整数(这就是它被“舍入”的原因)。在您的情况下,在执行操作后,结果将强制转换为double(因此整数结果将转换为double)。您需要做的是在两倍之间执行运算,这样结果就是两倍。这可以通过简单地将除法中涉及的一个变量的类型更改为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)someOtherIntVariable + (b1*a22-b2*a12) / (a11*a22-a12*a21);
    //...
}

这是行不通的,因为除法是在int变量之间执行的,然后加上一个双变量。这将与您现在遇到的问题相同

您的a*和b*变量是双精度的,对吗?什么数据类型是a11、a22、a12、a21、b1、b2?我记得在矩阵章节中使用了crammer规则您的a*和b*变量是双精度的,对吗?a11、a22、a12、a21、b1、b2是什么数据类型?我记得在矩阵章节中使用了crammer规则“只要把你的数字乘以1.0,就可以使它们成为十进制”或者,你知道,只要把它们转换成十进制。不需要在那里加乘法。
double sol1=((double)(b1*a22-b2*a12))/(a11*a22-a12*a21);
“只要把你的数字乘以1.0,就可以使它们成为十进制。”“或者,你知道,直接投下它们。没有必要把乘法丢进去<代码>双sol1=((双)(b1*a22-b2*a12))/(a11*a22-a12*a21)