在Java中,如果语句为true,为什么该代码返回false?看起来不像是浮点错误,打印时的值是相等的
我正在测试一个我一直在想的随机公式。在编写测试公式的代码后,大多数是正确的,但有些是错误的。然而,我注意到,在我的打印声明中,等式的两边是相等的,但代码说它们不是 代码如下:在Java中,如果语句为true,为什么该代码返回false?看起来不像是浮点错误,打印时的值是相等的,java,logic,calc,Java,Logic,Calc,我正在测试一个我一直在想的随机公式。在编写测试公式的代码后,大多数是正确的,但有些是错误的。然而,我注意到,在我的打印声明中,等式的两边是相等的,但代码说它们不是 代码如下: public static void main(String[] args){ for(int i = 0; i < 100; i++){ String t = runTest((100-i)/100.0,i/100.0); if(t.substring
public static void main(String[] args){
for(int i = 0; i < 100; i++){
String t = runTest((100-i)/100.0,i/100.0);
if(t.substring(0, 1).equals("1")) System.err.println(t);
else System.out.println(t.substring(1));
}
}
private static String runTest(double a, double b){
double l = (a + b);
double r = (a*a + b*b + 2*a*b);
boolean isValid = false;
if(l != 1) {
return 1+String.format("%f + %f = %f\tInvalid", a, b, a + b);
}
if(l==r){
isValid = true;
}
return 0+String.format("A: %f B: %f LEFT: %f RIGHT: %f RESULT: %s", a, b, l, r, String.valueOf(isValid));
}
我还尝试将l和r强制转换为整数,r返回0,有时意味着代码认为r小于0。在现实和打印语句中,右边也是1。一开始我以为这是一个浮点错误,但结果都是1
你知道为什么会发生这种情况,以及我如何解决这个问题吗
谢谢。运行此命令
public class Test {
public static void main(String[] args){
for(int i = 0; i < 100; i++){
String t = runTest((100-i)/100.0,i/100.0);
if(t.substring(0, 1).equals("1")) System.err.println(t);
else System.out.println(t.substring(1));
}
}
private static String runTest(double a, double b){
double l = (a + b);
double r = (a*a + b*b + 2*a*b);
boolean isValid = false;
if(l != 1) {
//return 1+String.format("%f + %f = %f\tInvalid", a, b, a + b);
return a + ":" + b+ ":" + a + b ;
}
if(l==r){
isValid = true;
}
return a + ":" + b+ ":" + l + ":" + r ;
}
}
是的,当格式化为浮点数时,它们看起来是相等的,但它们不是64位的双倍数,这是比较它们的方式,因此它们并不相等,正如您从我发布的代码的输出中看到的那样。运行此命令
public class Test {
public static void main(String[] args){
for(int i = 0; i < 100; i++){
String t = runTest((100-i)/100.0,i/100.0);
if(t.substring(0, 1).equals("1")) System.err.println(t);
else System.out.println(t.substring(1));
}
}
private static String runTest(double a, double b){
double l = (a + b);
double r = (a*a + b*b + 2*a*b);
boolean isValid = false;
if(l != 1) {
//return 1+String.format("%f + %f = %f\tInvalid", a, b, a + b);
return a + ":" + b+ ":" + a + b ;
}
if(l==r){
isValid = true;
}
return a + ":" + b+ ":" + l + ":" + r ;
}
}
是的,当格式化为浮点数时,它们看起来是相等的,但它们不是64位的双倍数,这是比较它们的方式,因此它们并不相等,正如您从我发布的代码输出中看到的那样。使用==运算符比较浮点数是否相等是错误的 您必须包含一个公差
final float T = 0.0000001;
if (Math.abs(l - r) < T)
isValid = true;
修改T,使其符合您的需要。使用==运算符比较浮点数是否相等是正确的 您必须包含一个公差
final float T = 0.0000001;
if (Math.abs(l - r) < T)
isValid = true;
修改T,使其符合您的需要。这真的很难做到。你在哪些输入上得到了你没有预料到的确切输出?很难做到这一点。您在哪些输入上得到了您没有预料到的确切输出?