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

恰好自己有过一点研究。

首先可以肯定,出现这种现象的原因并不是发生在二进制数的表示阶段,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。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值