Java中的浮点数

Java中的浮点数,java,numbers,floating-point,Java,Numbers,Floating Point,有谁能告诉我为什么以下节目的产出没有“不同” o/p:不同 相同的可以帮助理解,因为3.2f是一个浮动值,3.2是一个双值。浮点数总是有点不准确,因为二进制表示法不能准确地实现它们,所以比较它们是否精确相等是个坏主意。特别是比较浮动和双浮动。诸如3.2f==3.2f之类的表达式通常可以,但即使是在某些语言中,这些表达式也可能失败,例如,如果它们在寄存器中比在内存中更准确地表示数字。“3.2f”是一种浮点类型。“3.2”是double类型。此外,我认为任何带有十进制的东西都会默认为double,因

有谁能告诉我为什么以下节目的产出没有“不同”

o/p:不同
相同的

可以帮助理解

,因为3.2f是一个
浮动
值,
3.2
是一个
双值。浮点数总是有点不准确,因为二进制表示法不能准确地实现它们,所以比较它们是否精确相等是个坏主意。特别是比较浮动和双浮动。诸如
3.2f==3.2f
之类的表达式通常可以,但即使是在某些语言中,这些表达式也可能失败,例如,如果它们在寄存器中比在内存中更准确地表示数字。

“3.2f”是一种浮点类型。“3.2”是double类型。

此外,我认为任何带有十进制的东西都会默认为double,因此当你进行比较时,你必须添加'f',就像(f2==6.4f)

一样,因为3.2不能精确地表示为浮点数,而6.5是(提示:6.5=13*2^(-1)),此外,3.2是一个
double
文本,但3.2f是一个
float
文本。

6.5有一个有限的二进制表示:110.1

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

110.1000000000000000000(浮动)
=6.5

110.1000000000000000000000000000000000000000000000000(双倍)
=6.5

另一方面,3.2具有无限二进制表示:101.001100110011

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

101.0011001100110(浮动)
=3.2000000476837158203125

101.00110011001(双倍)
=3.200000000017763568394002504646778106689453125


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

+1因为这个解释比我费心写的要彻底得多。:)我想问题是,为什么它们中的一个应该比较相等。OP预计两者都不相等。“浮点数总是有点不准确”->错误。float和double可以用有限的二进制表示法表示分数,如6.5。请参阅我的答案以了解详细信息。没错,但是记住哪些小数点是准确的,哪些小数点不是准确的,并在此基础上使用或避免==真的很麻烦-事实上,不必记住这些细节是拥有一个具有良好定义语义的浮点数据类型的关键所在!因此,我总是建议人们认为所有的浮动值都是不准确的,即使从技术上讲,有些浮动值不准确。+1对你来说,因为这是唯一能真正回答问题的答案。我不知道OP为什么会接受另一个答案,而这个答案肯定不能解释为什么一个测试给出“相同”而另一个测试给出“不同”。我要补充的是,另一个原因是Java将不太精确的类型提升为更精确的类型进行比较,这使得3.2和3.2f的比较成为可能。如果它在这里截短了较长的类型,那么它们将是相同的,但谢天谢地,它(像C一样)使用了不断扩大的原始转换来完成大多数人可能期望的事情:@GregS:trudat+我也祝你:)
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");
}