本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Strange floating-point behaviour in a Java program
号
我在Java中遇到了这个奇怪的现象。在Java程序中尝试这个语句:
System.out.print(4.0-3.1);
输出为0.8999999。
为什么会这样?怎样才能改变呢?
你的问题的标题。我投了反对票。
@用户未知:是否编辑标题以更正明显的拼写错误?
即使没有任何错别字,标题仍然很糟糕。当然,在你被回答之前,你不知道什么是错误的(或者实际上是什么行为是指定的),但是提到"浮点"将是一个很好的开始。该网站甚至可以指出,你的问题是一个复制品没有人为干预。
@只是我的正确观点:打字错误在我这一边,但帕斯卡理解我的担心。
我建议每个科学家阅读关于浮点运算的知识。这是浮点数学的标准行为。大多数系统(包括Java)使用IEEE 754作为浮点数字的标准表示。确切地说,本标准并不总是完美地表示数值,因此您在打印时经常会看到轻微的数值不一致,如您在此处发现的。
这是一个典型的浮点结果runded。
从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
。
浮点不能精确表示0.1或0.1的任何倍数。它以2为基数,其中显示的数字系统以10为基数。以Base 2格式存储Base 10数据时,会丢失一些数据。
读数基:0.5 10为0.1 2。0.5 10是0.1 10的倍数
你在玩浮球。但是是二进制的。在十进制中有周期数。如1/3,即1.33333等。十进制系统中的一些数字不是周期性的,但在二进制系统中是周期性的。
因此,当存在周期数的可能性时,计算总是不准确的。
你可以在这个链接后面找到你的答案。
TL;Dr Summary:您必须了解浮点在计算中是如何表示的,这样您就知道为什么会发生这些事情。这是一个浮点表示的工件,如果您不能接受这种结果,那么您可以通过不使用浮点类型来更改它。
我看了看那个链接的后面,我能看到的只有我的显示器的背面。
@帕西亚布洛:聪明人!:)