java中的转换

java中的转换,java,Java,我的问题是关于java中的转换。 我有一个整数1615021049。当除以1(这也是一个浮点数)时,我在浮点数中得到的答案是1.6150206E9,当转换回整数时,得到的结果是1615021056,它不是原来的数字。请帮忙。 如果我将变量m和b转换为double,同样可以正常工作 int a=1615021023; float m=1; float b=a/m; int d= (int) b; 问题是float的尾数位数太少,无法准确表示1615021049。后者需要31位,前者只提供23位。

我的问题是关于java中的转换。 我有一个整数1615021049。当除以1(这也是一个浮点数)时,我在浮点数中得到的答案是1.6150206E9,当转换回整数时,得到的结果是1615021056,它不是原来的数字。请帮忙。 如果我将变量m和b转换为double,同样可以正常工作

int a=1615021023;
float m=1;
float b=a/m;
int d= (int) b;

问题是
float
的尾数位数太少,无法准确表示1615021049。后者需要31位,前者只提供23位。因此失去了精确性

这不是双精度的问题,因为双精度有52位尾数,足以表示1615021049


请参阅。

实数是无限的。浮点中只有32位。所以很明显,并不是每个实数都可以精确地表示为浮点数。浮点表示法使小数字比大数字更精确。

int
有31位(加号)来存储值,而
float
只有24位(加指数和符号)

这意味着一些较大的值不能正确表示。如果您使用double,它的值有53位,那么就不会有问题

简而言之,避免使用float,除非你有很好的理由使用它

int i = 1615021023;
int a = (int) (double) i;
int b = (int) (float) i;
System.out.println("double: " + a + ", float: " + b + ", should be " + i);
印刷品

double: 1615021023, float: 1615021056, should be 1615021023
在爪哇

  • 整数使用32位表示其值
  • 浮点使用23位尾数,因此大于2^23的整数将截断其中的最低有效位。例如,33554435(或0x200003)将被截断为大约33554432+/-4
  • DOUBLE使用52位尾数,因此能够表示32位整数而不会丢失数据。 你也可以在维基百科上看到“”