2012-11-24 23 views
1

我遇到此代码的问题! 我想在java中运行代码,但答案似乎很奇怪。Java数字格式窘境

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

答案是:假 但理论上它应该返回True。 如果我们使用a和b的值如0.15和0.15或者0.05和0.25,那么函数返回True。 我很困惑。 我已经阅读过Java/JavaScript等语言实现IEEE-754数字格式的地方!如果是这样,那么这是什么格式和代码有什么问题?无论如何改变数字格式?

+1

这会有帮助吗? (a + b)==。3F? –

+0

可能的Dupe http://stackoverflow.com/questions/7289361/double-arithmetic-and-equality-in-java –

+0

谢谢!我之前没有注意到这个问题。问题在于数字表示的二进制形式。 –

回答

4

漂浮物(a+b)和双打(0.3)之间的精确差异导致条件为假。你可以改用(a+b)==0.3F。即

float a = 0.1F; 
float b = 0.2F; 
if ((a + b) == 0.3F) { // notice the "F" 
    System.out.println("True"); 
} else { 
    System.out.println("False"); 
} 
 
True 

编辑:在这种情况下,即使您使用double S中的条件将是false

double a = 0.1; 
double b = 0.2; 
if ((a + b) == 0.3) { 
    System.out.println("True"); 
} else { 
    System.out.println("False"); 
} 
 
False 

印刷0.1 + 0.2将揭示w^HY(数量不能完全表示):

 
0.30000000000000004 
+0

这是行不通的。由于将10个碱基转换为2个碱基而造成的数据丢失也可能导致条件错误。 – ankitjaininfo

+0

O.K.我忘了用0.3提到f。 –

+0

如果所有变量都声明为double,该怎么办?然后编译并运行,看到答案是错误的! –

1

(a + b)是浮动的,而0.3是double。你应该把它与同类型产品比较:

if ((a + b) == 0.3F) { 
+0

尝试运行程序,取值为a = 0.15和b = 0.15,然后检查输出! –

1

简单˚F添加到数字的末尾做出doublefloat之间的编译器区分:

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3f){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

UPDATE:

也看到类似的问题:

其中最好的答案指出,你应该使用检查高高飞翔ewuality:

if(Math.abs((a+b) - 0.3F) < epsilon) 

其中小量是一个非常小的数字,如0.00000001,根据所需的精度。

+0

忘记f!用声明为double的所有变量运行程序! –

+0

@ankurSharma不会工作。作为.1/.2/.3它们没有确切的二进制表示。建议不要在float和double上使用==。 –

+0

是啊!这就是IEEE-754号码表示方案的问题。它也是JavaScript的问题! 感谢您的时间和帮助! –

0
float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

.3默认情况下是双精度型。你确实看到它为.3,但对于计算机,它的确切值是.2999998 ...。因此有所不同。

如果你明确地告诉编译器.3是float,那么你的类比将成立。

所以

float a=0.1F; 
float b=0.2F; 
if((a+b)==0.3F){ 
System.out.println("True"); 
} 
else{ 
System.out.println("False"); 
} 

按照this thread满足你渴望的 “双” 的问题

+0

尝试编译声明所有变量为double而不是float的程序,然后告诉我你是怎么得到的! –

+0

@ankurSharma我知道那个.1/.2/3不是确切的浮动或双重。我们在玩一些流行测验吗? –

+0

@ankursharma请参考文章中的更新链接。 –

1

决不比较浮点/双精度与==迹象。

即使您在数字后加上'f',这也无法正常工作。这里的问题不是格式,而是数据丢失。数据丢失是因为将10个碱基转换为2个碱基也可能使条件成为假。