Java中的浮点数

时间:2010-05-29 18:50:05

标签: java numbers floating-point

有谁能请我为什么以下程序的输出不是“有所不同”?

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 个答案:

答案 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.2double值。浮点数总是略微不准确,因为二进制表示不能准确地实现它们,因此将它们进行精确相等比较是一个坏主意。 特别比较浮动与双打。像3.2f == 3.2f这样的表达式通常都可以,但即使是某些语言也可能失败,例如如果它们比寄存器更准确地表示寄存器中的数字。

答案 3 :(得分:1)

This有助于理解

答案 4 :(得分:0)

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

答案 5 :(得分:0)

另外,我认为带小数的任何内容都默认为double,所以当你进行比较时,你必须像if(f2==6.4f)那样添加'f'。