Java中的浮点数

任何人都可以请我为什么以下程序的输出不是“不同的”?

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:不同的

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

你可以清楚地看到,这些数字是不一样的!

因为3.2不能完全表示为浮点数而6.5是(提示:6.5 = 13 * 2 ^( – 1)),以及3.2是double字面但3.2f是float字面的事实。

因为3.2f是float值而3.2double float值。 浮点数总是略微不准确,因为二进制表示不能准确地实现它们,因此将它们进行比较以获得完全相等是一个坏主意。 特别是比较浮动与双打。 像3.2f == 3.2f这样的表达式通常是可以的,但即使是某些语言中的表达也会失败,例如,如果它们比寄存器更准确地表示寄存器中的数字。

这有助于理解

“3.2f”是float类型。 “3.2”是double类型。

另外,我认为带小数的任何东西都默认为double,所以当你进行比较时,你必须添加’f’,如if(f2==6.4f)