2

我对这段代码有问题!我正在尝试在 java 中运行代码,但答案似乎很奇怪。

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

答案是:False 但理论上应该返回 True。如果我们使用 a 和 b 的值,例如 0.15 和 0.15 或 0.05 和 0.25,则该函数返回 True。我很困惑。我在某处读过 Java/JavaScript 等语言实现了 IEEE-754 数字格式!如果是这样,那么这种格式是什么,代码有什么问题?有没有办法改变数字格式?

4

5 回答 5

5

a+b浮点数 ( ) 和双精度数 ( )之间的精度差异0.3导致条件为假。您可以改为使用(a+b)==0.3F. IE

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");
}
真的

编辑:在这种情况下,即使你使用doubles 条件将是false

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

打印0.1 + 0.2将揭示原因(数字无法完美表示):

0.30000000000000004
于 2012-11-24T17:36:39.173 回答
1

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

if ((a + b) == 0.3F) {
于 2012-11-24T17:36:52.630 回答
1

只需将f添加到数字的末尾即可使编译器区分 adouble和 a float

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

更新:

也看到这个类似的问题:

最佳答案表明您应该使用以下方法检查 loat ewuality:

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

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

于 2012-11-24T17:37:00.247 回答
1

切勿将 Float/Double 与 == 符号进行比较。

即使您在数字后加上“f”,这也不起作用。这里的问题不是格式,而是数据丢失。由于将 10 碱基转换为 2 碱基而发生数据丢失也会使条件为假。

于 2012-11-24T17:47:00.343 回答
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");
}

关注这个话题,满足你对“双重”问题的渴望

于 2012-11-24T17:42:30.940 回答