2014-01-25 172 views
2

对于这些代码行,我返回0作为输出,它们都是相等的。现在,如果我理解正确,ab和c可能会存储稍微不同的真实值.3版本。因此,当针对这些值执行Float.compare(...)时,我希望返回0以外的值作为输出。为什么我将它们作为0?浮点运算和浮点值比较

float a = 0.15f + 0.15f; 
float b = 0.1f + 0.2f; 
float c = 0.3f; 
System.out.println(Float.compare(a, b)); //<--- outputs 0 
System.out.println(Float.compare(a, c)); //<--- outputs 0 
System.out.println(Float.compare(b, c)); //<--- outputs 0 
+1

只是因为浮点不是一般的不够准确,并不意味着它是不是在特定情况下不够准确。 –

+2

你可以加上你的问题,对于double值,它不会以这种方式工作(因为'0.1d + 0.2d'的结果是'0.30000000000000004',所以'-1','0','1'其他数字是'0.3')。 – Pshemo

+0

@Pshemo:“0.1d”和“0.1f”一样不准确,只是更多的小数位。浮点精度不能表示0.1,它是以2为底的重复序列。 –

回答

1

因为,就像你说的,他们可能略有不同的版本。但有了这些简单的表达式,就不会有精度损失,所以a,b和c都包含完全相同的版本.3f

为了好玩,试试这个。在这里,你会失去精度,比较的结果将不会是0

public static void main(String[] args) { 
    float a = .3f; 
    float b = .3f; 
    a = (float) Math.cos(a); 
    a = (float) Math.acos(a); 
    System.out.println(Float.compare(a, b)); 
}