该
float类型使用与
int(32位)相同的位数表示比
int仅表示整数更大范围的浮点数。
这会导致精度下降,因为并非每个
int数字都可以用来精确表示
float。仅24位用于表示数字的小数部分(包括符号位),而其他8位用于表示指数。
如果将此
int值分配给
double,则不会有任何精度损失,因为它
double具有64位,并且其中32个以上的位用于表示小数。
这是更详细的说明:
123456789作为int的二进制表示形式是:
00000111 01011011 11001101 0001 0101
使用以下公式从其32位构造一个单精度浮点数:
(-1)^sign * 1.b22 b21 ... b0 * 2^(e-127)
sign最左边的位在哪里(b31)。b22到b0是小数位,而b30到b23位构成指数e。
因此,将
int123456789 转换为时
float,只能使用以下25位:
00000111 01011011 11001101 00010101- --- -------- -------- -----
我们可以安全地摆脱任何前导零(符号位除外)和任何尾随零。这使您剩下3个最低有效位,我们必须将其删除。我们可以减去5得到123456784:
00000111 01011011 11001101 00010000- --- -------- -------- -----
或加3得到123456792:
00000111 01011011 11001101 00011000- --- -------- -------- -----
显然,加3可以得到更好的近似值。



