关于int转换为float时精度丢失问题的讨论

List item

JAVA中关于int、float的存储字节和精度的讨论

**首先,JAVA的基本数据类型包括:byte、int、short、long、float、double、char、boolean。前七个数据类型所对应的字节大小分别为1、4、2、8、4、8、2。(先不讨论boolean的大小,有争议。)
int 和float都是4字节。但因为所表示数据范围不同,其所存储的形式也不同。虽然都是32位,但int的32位数据的存储方式为:最高位符号位(1位),剩下31位表示数据大小。因此int的数据表示范围为-231——+231-1(具体表示范围的详解会在下方补充)。而float和double设计用来填充小数部分无法表示的空白。因此float的数据设计存储形式为最高位符号位(1位),再向后8位为阶码(也成移码),最后23位为尾数表示数据大小。float浮点表示小数采用类似科学计数法的形式。分为尾数(尾码)和指数(阶码)两个部分。所以float虽然看起来表示范围很大,但是有些数据缺失表示不到的。
以8位十进制数为例,如果8位全部用来表示数据(即8位全为尾数),类似于int,和4位用于表示指数,4位用于表示数据大小(尾数),类似于float。当数据小于等于4位时,比如00001234,那么int转为float时不会出现精度丢失,因为float的尾数部分也可以准确表示数据大小。但是如果数据为12345678,那么从int转为float时,float就无法准确表示尾数的所有部分了,他只能舍弃后四位。

猜你喜欢

转载自blog.csdn.net/Jonsnow1457/article/details/88744108
今日推荐