Java中的浮点数

Alv*_*vin 5 java floating-point numbers

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

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");
}
Run Code Online (Sandbox Code Playgroud)

o/p:不同的

fre*_*low 11

6.5具有有限二进制表示:110.1

具有至少4个有效位的任何浮动类型都可以完美地表示该数字.

110.100000000000000000000(float)
= 6.5

110.10000000000000000000000000000000000000000000000000(double)
= 6.5

3.2另一方面有无限二进制表示:101.0011001100110011 ...

float和double没有无限精度因此只能近似这个数字:(

101.001100110011001100110(float)
= 3.2000000476837158203125

101.00110011001100110011001100110011001100110011001101(double)
= 3.20000000000000017763568394002504646778106689453125

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

  • 我只想补充一点,另一个原因是Java将更精确的类型提升为更精确的类型以进行比较,这使得3.2和3.2f的比较成为可能.如果它在这里截断了较长的类型,这些将是相同的,但幸运的是它(如C)使用*扩展原始转换*来做大多数人可能期望的事情:http://bit.ly/d8Yx3N (2认同)

Jam*_*olk 5

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