java类型转换精度丢失

在进行详细讲解之前,先看看数值类型之间的合法转换:
在这里插入图片描述
    从图中我们可以看出存储占用字节少的类型向存储占用字节多的类型转化不会丢失精度(实线),而存储占用字节多的类型向存储占用字节少的类型(包括占用字节一样的类型)转换都可能发生精度丢失(虚线),那么为什么会造成精度丢失呢?看下面例子。

直接转换引起的精度丢失

就拿int转换float来解释吧:我们知道int是4个字节32位,其格式为:
在这里插入图片描述
它的取值范围:-231~231-1;
虽然float也是4个字节32位,但格式和int不一样。其格式为:
在这里插入图片描述
它的取值范围:-3.40282347E+38F~3.40282347E+38F,具体点可以在一个坐标上体现:
在这里插入图片描述
从图中可以看出当float越靠近两端时,可以表示的数值就越稀疏。当稀疏到一定程度时,float将不能表示int类型的值,即将int转换成float类型时,可以会和int类型表示的值存在偏差,就像上图中所示,float中没有该int数值对应的值时,float就会认为这个值的大小是离这个点最近的点所对应的值,精度丢失也由此而来。

强制转换引起的精度丢失

同样用int和float;为什么int可以直接转换成float,而float不能转换成int呢?这是因为float表示的数值范围要比int表示的多,也就是说float中有些数值是int无法表示的,所以float转换成int得强制转换。float转int精度丢失有两种情况:
1.int可以表示该float值(这和int转float精度丢失情况是一样的):

在这里插入图片描述
2。int无法表示float值(int会将该值认为是最大或最小值):

在这里插入图片描述
其它类型转换时产生的精度丢失原理和这一样,就不一一介绍了。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值