有谁能请我为什么以下程序的输出不是“有所不同”?
public static void main(String[] args)
{
float f1=3.2f;
float f2=6.5f;
if(f1==3.2)
System.out.println("same");
else
System.out.println("different");
if(f2==6.5)
System.out.println("same");
else
System.out.println("different");
}
o / p:不同 相同
答案 0 :(得分:11)
6.5具有有限的二进制表示:110.1
任何具有至少4个有效位的浮点类型都可以完美地表示这个数字。
110.100000000000000000000(浮动)
= 6.5
110.10000000000000000000000000000000000000000000000000(双)
= 6.5
3.2具有无限二进制表示:101.0011001100110011 ...
float和double没有无限精度,因此只能接近这个数字:(
101.001100110011001100110(浮动)
= 3.2000000476837158203125
101.00110011001100110011001100110011001100110011001101(双)
= 3.20000000000000017763568394002504646778106689453125
你可以清楚地看到,这些数字不一样!
答案 1 :(得分:5)
因为3.2不能完全表示为浮点数而6.5是(提示:6.5 = 13 * 2 ^( - 1)),以及3.2是double
字面但3.2f的事实是一个float
字面值。
答案 2 :(得分:3)
因为3.2f是float
值而3.2
是double
值。浮点数总是略微不准确,因为二进制表示不能准确地实现它们,因此将它们进行精确相等比较是一个坏主意。 特别比较浮动与双打。像3.2f == 3.2f
这样的表达式通常都可以,但即使是某些语言也可能失败,例如如果它们比寄存器更准确地表示寄存器中的数字。
答案 3 :(得分:1)
This有助于理解
答案 4 :(得分:0)
“3.2f”是float类型。 “3.2”是double类型。
答案 5 :(得分:0)
另外,我认为带小数的任何内容都默认为double,所以当你进行比较时,你必须像if(f2==6.4f)
那样添加'f'。