Java 为什么在下面的代码中从int转换为float时会丢失值?

Java 为什么在下面的代码中从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;

输出:

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
-    --- -------- -------- -----