我遇到此代码的问题! 我试图在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数字格式化!如果是这样,那么这种格式是什么以及代码有什么问题?反正有没有改变数字格式?
答案 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 添加到数字的末尾,即可使编译器区分double
和float
:
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以满足您对“双重”问题的渴望