为了账号安全,请及时绑定邮箱和手机立即绑定

Java程序中奇怪的浮点行为

Java程序中奇怪的浮点行为

慕田峪4524236 2019-07-26 15:14:25
Java程序中奇怪的浮点行为在我的程序中,我有一个具有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.240000000000000020.24000000000000002 + 0.04 = 0.280.28 + 0.04 = 0.320.32 + 0.04 = 0.360.36 + 0.04 = 0.399999999999999970.39999999999999997 + 0.04 = 0.439999999999999950.43999999999999995 + 0.04 = 0.47999999999999990.4799999999999999 + 0.04 = 0.51999999999999990.5199999999999999 + 0.04 = 0.55999999999999990.5599999999999999 + 0.04 = 0.60.6 + 0.04 = 0.640.64 + 0.04 = 0.680.68 + 0.04 = 0.72000000000000010.7200000000000001 + 0.04 = 0.76000000000000010.7600000000000001 + 0.04 = 0.80000000000000020.8000000000000002 + 0.04 = 0.84000000000000020.8400000000000002 + 0.04 = 0.88000000000000020.8800000000000002 + 0.04 = 0.92000000000000030.9200000000000003 + 0.04 = 0.9600000000000003为什么会发生这种事?!
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

程序语言中浮点值最常见的存储-IEEE单打和双打-对大多数十进制分数没有精确的表示。

原因是它们以二进制浮点格式存储值,而不是十进制浮点格式。唯一能精确表示的分数值是2的负幂和。数字如下:

  • 0.5 (2^-1)

  • 0.125 (2^-3)

  • 0.625 (2^-1 + 2^-3)

等。

你所看到的是,像0.96这样的数字的表示并不完全是可表示的,因为它们不能用2的负幂之和来表示。因此,当以十进制小数的形式以完全精确的方式打印出来时,它们将与原始值不匹配。




查看完整回答
反对 回复 2019-07-27
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

查看完整回答
反对 回复 2019-07-27
?
繁华开满天机

TA贡献1816条经验 获得超4个赞


其他答案提到了原因,但没有提到如何避免。

有几种解决办法:

  • 缩放:如果您的所有数字都是0.01的倍数(例如),那么将所有数据乘以100,并使用整数算术(这是精确的)。
  • 数字类型:如果语言具有数字类型(类似于

    numeric

    输入SQL),您可以使用它。
  • 任意精确理据:使用bignum库,如

    GMP

    ,它允许您将这些数字表示为两个整数的比率。
  • 小数点浮点数:如果您有十进制浮点数,如

    IEEE-754 r

    你可以用它。




查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 274 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号