C和Java中的条件相同,结果不同

时间:2011-11-14 06:01:25

标签: java c

在C:

float a = 1.3;
if (a == 1.3)
    printf("Hello c");  
else 
    printf("Bye c"); 

//output: Bye c

在Java中:

float a = 1.3;
if (a == 1.3)
    System.out.println("Hello java");
else 
    System.out.println("Bye java");

//output: Hello java

为什么会这样?

3 个答案:

答案 0 :(得分:21)

您无法将“1.3”完全表示为二进制浮点数。

将文字1.3转换为浮点数将导致浮点数接近但不完全等于1.3。

在Java案例中,你很幸运,因为JVM将“1.3”解释为标准的java float并转换为相同的1.3。二进制数。在C情况下,标准说1.3应该被解释为“double”并将其转换为二进制浮点,它比普通浮点数更接近十进制值1.3。

最重要的是,你永远不应该将浮动数据相等,因为存储的小变化,计算顺序等会产生略微不同的结果。你应该总是“括起”任何浮动比较,如下所示:

if (a > 1.299 && a < 1.301) // something close to 1.3

答案 1 :(得分:1)

为了帮助你将大脑包裹起来,让我给你一个简单的类比。请记住,浮点数是近似值。许多数字无法准确表示。现在,想象一下我们用小数做同样的事情,比如我们在小数位后面用六位数。

我们如何代表1/3? .333333是我们能做的最好的事情。但现在3 * 1/3不等于1。

我们如何代表2/3? .666666至少会确保2 * 1/3 = 2/3。但2/3 + 1/3不等于1。

我们可以将{2}表示为.666667。但是2 * 1/3不会等于2/3。但至少1/3 + 2/3将等于一个。

所以重点是,通过近似表示,您无法确保完全正确的答案,只能得到足够的答案。一般情况下,除非你100%肯定,否则你不应该将浮点数进行比较,除非你明白自己在做什么以及为什么这样做。

答案 2 :(得分:0)

关于C必须知道的第一件事是,由于编译器实现了浮点数,因此测试2个浮点数是否相等是非常错误的。 '1.3'当存储在一个浮点变量中时,你没有填满编译器存储的所有小数位,并且可能会填充一些数字,从而导致相等测试的失败