Java怪异语法_Java中的浮点怪异现象

本问题已经有最佳答案,请猛点这里访问。

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:您必须了解浮点在计算中是如何表示的,这样您就知道为什么会发生这些事情。这是一个浮点表示的工件,如果您不能接受这种结果,那么您可以通过不使用浮点类型来更改它。

我看了看那个链接的后面,我能看到的只有我的显示器的背面。

@帕西亚布洛:聪明人!:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值