我试着用克雷默法则快速求解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);但是由于某种原因,对于1,2,3,4,5,6,我得到了-4.0和4.0,而不是-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 +")");
}发布于 2012-12-02 00:35:33
在操作前将任何变量显式转换为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上执行操作,并产生一个分配给double的int。
一旦您将分子或任何参与变量乘以1.0或显式将其转换为双精度,它将变为双精度,然后剩余变量将自动提升为双精度,这将根据需要生成 double 。
发布于 2012-12-02 00:38:10
注意对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 +")");
}发布于 2012-12-02 00:38:49
这可能是因为操作数是整数。
当你在整数之间执行一个操作时,结果是另一个整数(这就是为什么它会被“四舍五入”)。在您的示例中,在执行操作后,结果被强制转换为double (因此,整数结果被转换为double)。您需要做的是在double之间执行操作,这样结果就是double。这可以通过简单地将除法中涉及的一个变量的类型更改为双精度(例如b1、a22、a11、b2或a12)来完成:其他变量将自动提升为双精度。
示例代码:
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 +")");
}或者,如果你不希望你的变量的类型是双精度的,你可以只转换你的分子或者分母(或者两者都有,但这不会有什么不同):
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 +")");
}此外,如果计算分子(或分母)所涉及的任何变量为双精度,则整个分子将‘转换’为双精度,因此除法的结果为双精度(因为分子或分母中至少有一个为双精度)。但是,如果你有一些这样的代码:
if (((a11*a22)-(a12*a21))!=0) {
double sol1 = (double)someOtherIntVariable + (b1*a22-b2*a12) / (a11*a22-a12*a21);
//...
}这是行不通的,因为除法是在整型变量之间执行的,然后再加上一个双精度变量。这将会有和你现在一样的问题
https://stackoverflow.com/questions/13661323
复制相似问题