Java中的浮点奇怪现象

Java中的浮点奇怪现象,java,floating-accuracy,Java,Floating Accuracy,可能重复: 我在Java中遇到了这种奇怪的现象。在Java程序中尝试以下语句: System.out.print(4.0-3.1); 输出将为0.8999999 为什么会发生这种情况?怎样才能改变呢?我推荐阅读。这是浮点数学的标准行为。大多数系统(包括Java)将其用作浮点数的标准表示形式。准确的数值并不总是完美地体现在本标准中,因此您在打印时经常会看到轻微的数值不一致,正如您在此处所发现的。您将找到您的答案 TL;DR summary:您必须了解浮点在计算中是如何表示的,这样您才能知道为什

可能重复:

我在Java中遇到了这种奇怪的现象。在Java程序中尝试以下语句:

System.out.print(4.0-3.1);
输出将为
0.8999999

为什么会发生这种情况?怎样才能改变呢?

我推荐阅读。这是浮点数学的标准行为。大多数系统(包括Java)将其用作浮点数的标准表示形式。准确的数值并不总是完美地体现在本标准中,因此您在打印时经常会看到轻微的数值不一致,正如您在此处所发现的。

您将找到您的答案


TL;DR summary:您必须了解浮点在计算中是如何表示的,这样您才能知道为什么会发生这些事情。这是一个浮点表示的工件,如果您不能接受这种结果,您可以通过不使用浮点类型来修改它。

浮点不能精确表示值0.1或0.1的任意倍数。它是以2为基数的,其中显示它的数字系统是以10为基数的。以base 2格式存储base 10数据时会丢失一些数据。

这是一个典型的浮点结果

Float
Double
中可以得到不同的结果:

System.out.println(4.0f-3.1f);
System.out.println(4.0d-3.1d);
输出:

0.9000001
0.8999999999999999
这是因为
0.1
无法在基数2中均匀表示,并导致精度损失。例如:

System.out.println(2.0f-1.9f);
System.out.println(2.0d-1.9d);
应同时返回
0.1
,但实际上将输出:

0.100000024
0.10000000000000009

您正在享受与浮动类型的乐趣。但是是二进制的。十进制中有周期数。比如1/3,也就是1.33333,依此类推。十进制中的一些数字不是周期性的,但在二进制中是周期性的


因此,当存在周期数的可能性时,计算总是不准确。

请为您的问题编写标题。我投了反对票。@user unknown:您没有想到编辑标题以更正明显的拼写错误?即使没有任何拼写错误,标题仍然很糟糕。诚然,在得到回答之前,您不可能知道什么是错误的(或者实际上是什么行为符合规定),但是提到“浮点”将是一个好的开始。网站甚至可以指出你的问题是重复的,没有人为干预。@我的正确意见是:打字错误在我这边,但帕斯卡理解我的担心。我看了看链接的后面,我能看到的只是显示器的背面:-)读数字|基数:0.5 | 10是0.1 | 2。0.5 | 10是0.1 | 10的倍数