关于float = 3.14无法通过编译short = 1却能通过编译的猜想

short和byte直接赋值整形,如果整形在其承受范围内就可以进行隐式转换,所以可以直接赋值
byte b=1;//合法
byte b=128; //非法

但是3.14不是也应该在float范围内吗,不能进行隐式转换吗?答案是3.14确实不在float的范围内,并且也不在double的范围内,float和double都无法表示出准确的3.14,3.14在计算机中是一个无限长度的的二进制(如果计算机允许)。

这有关浮点数在计算机中的的表示方式(具体大家可以查一查其他资料 http://blog.csdn.net/misterliwei/article/details/5455666,然后结合如何将小数进行二进制转换,基本就可以明白了)

举例子说 0.3 这个数会把double的64位全部占用,如果给予更多的位数一千位数一万位也表示不出来,同理3.14一样,在计算机中小数的表示基本上无法准确的描述出来,一般是只是一个近似值(除了0.5这些比较特殊的例子外),这也是为什么浮点数的比较我们无法使用 == 来进行,而是使用两数之差在一个很小的范围内说明两数字相等。

所以float = 3.14f,把一个64位的数转换成32位的数字会损失后面的精度,转换之后两数字就已经不再相等,
double a = 3.14; 
float b = (float)a;
double c = (double)b; 
 if(a != c)  return "不等";//可以进行验证


但是short a = 1;这个确实可以不损失正确性的的将int型号转换成short类型。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值