Java数字格式困境

时间:2012-11-24 17:33:49

标签: 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数字格式化!如果是这样,那么这种格式是什么以及代码有什么问题?反正有没有改变数字格式?

5 个答案:

答案 0 :(得分:5)

浮点数(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,条件也会是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将揭示原因(数字无法完美表示):

0.30000000000000004

答案 1 :(得分:1)

(a + b)是一个浮点数,而0.3是double。您应该将它与相同类型进行比较:

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

答案 2 :(得分: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");
}

更新:

也看到了类似的问题:

最佳答案指出你应该使用以下方法检查厌恶性:

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

其中epsilon是一个非常小的数字,如0.00000001,具体取决于所需的精度。

答案 3 :(得分:1)

永远不要将Float / Double与==符号进行比较。

即使你在数字后加上“f”,这也行不通。这里的问题不是格式,而是数据丢失。由于将10个基数转换为2个碱基也可能导致数据丢失。

答案 4 :(得分: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 a=0.1F;
float b=0.2F;
if((a+b)==0.3F){
System.out.println("True");
}
else{
System.out.println("False");
}

关注this thread以满足您对“双重”问题的渴望