在进行详细讲解之前,先看看数值类型之间的合法转换:
从图中我们可以看出存储占用字节少的类型向存储占用字节多的类型转化不会丢失精度(实线),而存储占用字节多的类型向存储占用字节少的类型(包括占用字节一样的类型)转换都可能发生精度丢失(虚线),那么为什么会造成精度丢失呢?看下面例子。
直接转换引起的精度丢失
就拿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会将该值认为是最大或最小值):
其它类型转换时产生的精度丢失原理和这一样,就不一一介绍了。