Java 为什么在下面的代码中从int转换为float时会丢失值?
输出: 123456789Java 为什么在下面的代码中从int转换为float时会丢失值?,java,type-conversion,Java,Type Conversion,输出: 123456789 123456792float类型使用与int相同的位数(32位)来表示范围大于int仅用于表示整数的浮点数 这会导致精度损失,因为不是每个int数字都可以用浮点值准确表示。只有24位用于表示数字的分数部分(包括符号位),而其他8位用于表示指数 如果将此int值指定给double,则不会有任何精度损失,因为double有64位,其中32位以上用于表示分数 这里有一个更详细的解释: 123456789作为整数的二进制表示为: int value1 = 123456789;
123456792
float
类型使用与int
相同的位数(32位)来表示范围大于int
仅用于表示整数的浮点数
这会导致精度损失,因为不是每个int
数字都可以用浮点值
准确表示。只有24位用于表示数字的分数部分(包括符号位),而其他8位用于表示指数
如果将此int
值指定给double
,则不会有任何精度损失,因为double
有64位,其中32位以上用于表示分数
这里有一个更详细的解释:
123456789作为整数的二进制表示为:
int value1 = 123456789;
float value2 = value1;
System.out.println(value1);
System.out.println(value2);
单精度浮点数由其32位构成,使用:
其中,符号
是最左边的位(b31)。b22至b0为分数位,b30至b23为指数e
因此,当您将int
123456789转换为float
时,只能使用以下25位:
(-1)^sign * 1.b22 b21 ... b0 * 2^(e-127)
我们可以安全地去掉任何前导零(符号位除外)和任何尾随零。这就剩下了3个最低有效位,我们必须去掉它们。我们可以减去5得到123456784:
00000111 01011011 11001101 00010101
- --- -------- -------- -----
或添加3以获得123456792:
00000111 01011011 11001101 00010000
- --- -------- -------- -----
显然,加上3可以得到更好的近似值。请更详细地解释我,它与尾数和尾数有关吗exponent@pramodkumar分数也被称为尾数,所以是的。当处理比较大的数字时,我如何克服这种精度损失?这也解释了,为什么float最多可以容纳大约
3*10^38
,而int只能2*10^9
@pramodkumar使用biginger
表示大整数。
00000111 01011011 11001101 00010000
- --- -------- -------- -----
00000111 01011011 11001101 00011000
- --- -------- -------- -----