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

为什么 JAVA 中有时能够精确表示浮点数

为什么 JAVA 中有时能够精确表示浮点数

幕布斯7119047 2018-11-13 19:36:38
在java中设置double = 0.1,然后打印出来,仍然是0.1.但是按照2进制浮点数的表示法,应该是不能精确表示0.1的,只能精确表示类似0.5,0.25这样的数.我想知道JAVA是怎么能够在某些情况下精确表示浮点数的.再举个例子,0.4/4=0.1,而0.4-0.3=0.10000000000000003.
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

恰好自己有过一点研究。

首先可以肯定,出现这种现象的原因并不是发生在二进制数的表示阶段,0.1确实无法用二进制浮点数精确表示,这个毋庸置疑。

之所以会出现本不能精确表示的浮点数在打印出来后反而是精确的,是因为在将其转换为字符串的过程中,Java耍了点小聪明。它会将看起来疑似是“整”的浮点数进行特殊处理,转换为那个“整”的十进制小数形式。

举个例子,比如0.1,如果按内部表示直接转换过来可能应该是0.1000...0011,这种情况下,最后两位的数值太小,Java就会认为是精度不够而产生的,于是转成字符串的时候会将其转为0.1。

而0.4/4和0.4-0.3,由于参与计算的时候,都至少有一个是不能精确表示的数,所以结果可能会有一定的误差。按照前面的例子,可能0.4/4的结果为0.1000...0010,最后一位与真正的0.1不同,而0.4-0.3的结果为0.1000...0300,这个误差就比较大了。

注:以上仅仅是我臆想的值,并不是真实的数据。能够说明问题即可。

由于两者误差不同,所以0.4/4的结果仍然会被认为是“整”的小数0.1,但0.4-0.3却由于累计的误差较大而被认为不是0.1,而是原样转换为0.1000...03。


查看完整回答
反对 回复 2018-11-13
  • 1 回答
  • 0 关注
  • 733 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信