Java中的转换

4

我的问题涉及Java中的转换。 我有一个整数1615021049。当我将它除以1(也是浮点数)时,得到的浮点数答案是1.61502106E9,而将其转换回整数后得到的是1615021056,而不是原始数字。请帮忙解决。 如果将变量m和b转换为double,则可以正常工作。

int a=1615021023;
float m=1;
float b=a/m;
int d= (int) b;
4个回答

5
问题在于,float的尾数位数过少,无法精确表示1615021049。后者需要31位,而前者只提供23位。因此会出现精度损失。
这不是doubles的问题,因为double有52位的尾数,足以表示1615021049。
请参见维基百科

3

实数是无限的,而浮点型只有32位。因此,显然,并不是所有实数都能准确地表示为浮点型。而且,浮点型表示法使得小数字比大数字更加精确。


2

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

这意味着一些大的值不能被准确表示。如果您使用具有53位值的double,则不会出现问题。

简而言之,除非有非常好的理由要使用它,否则请避免使用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

1

在Java中,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接