加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java程序中的奇怪的浮点行为

发布时间:2020-12-15 00:27:23 所属栏目:Java 来源:网络整理
导读:参见英文答案 Is floating point math broken?29个 在我的程序中,我有一个数组有25个双值0.04 当我尝试在循环中求和这些值时,我得到以下结果: 0.0 + 0.04 = 0.040.04 + 0.04 = 0.080.08 + 0.04 = 0.120.12 + 0.04 = 0.160.16 + 0.04 = 0.20.2 + 0.04 = 0.24
参见英文答案 > Is floating point math broken?29个
在我的程序中,我有一个数组有25个双值0.04
当我尝试在循环中求和这些值时,我得到以下结果:
0.0 + 0.04 = 0.04
0.04 + 0.04 = 0.08
0.08 + 0.04 = 0.12
0.12 + 0.04 = 0.16
0.16 + 0.04 = 0.2
0.2 + 0.04 = 0.24000000000000002
0.24000000000000002 + 0.04 = 0.28
0.28 + 0.04 = 0.32
0.32 + 0.04 = 0.36
0.36 + 0.04 = 0.39999999999999997
0.39999999999999997 + 0.04 = 0.43999999999999995
0.43999999999999995 + 0.04 = 0.4799999999999999
0.4799999999999999 + 0.04 = 0.5199999999999999
0.5199999999999999 + 0.04 = 0.5599999999999999
0.5599999999999999 + 0.04 = 0.6
0.6 + 0.04 = 0.64
0.64 + 0.04 = 0.68
0.68 + 0.04 = 0.7200000000000001
0.7200000000000001 + 0.04 = 0.7600000000000001
0.7600000000000001 + 0.04 = 0.8000000000000002
0.8000000000000002 + 0.04 = 0.8400000000000002
0.8400000000000002 + 0.04 = 0.8800000000000002
0.8800000000000002 + 0.04 = 0.9200000000000003
0.9200000000000003 + 0.04 = 0.9600000000000003

为什么会发生这样的事情?

解决方法

编程语言 – IEEE singles and doubles中最常见的浮点值存储 – 对于大多数小数部分没有精确表示.

原因是它们以二进制浮点格式存储值,而不是十进制浮点格式.可以精确表示的唯一的小数值是两个负幂的和.数字如:

> 0.5(2 ^ -1)
> 0.125(2 ^ -3)
> 0.625(2 ^ -1 2 ^ -3)

等等.

你所看到的是,像0.96这样的数字表示不是完全可表现的,因为它们不能表达为两个负的权力之和.因此,当以十进制小数全精确打印时,它们将不匹配原始值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读