4

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

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

4 回答 4

5

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

这不是问题,doubles因为 adouble有 52 位尾数,足以表示 1615021049。

参见维基百科

于 2013-01-04T08:07:48.360 回答
3

有无穷多个实数。浮点数只有 32 位。很明显,并不是每个实数都可以准确地表示为浮点数。浮点表示使小数字比大数字更准确。

于 2013-01-04T08:08:14.430 回答
2

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

这意味着一些较大的值不能无误地表示。如果您使用具有 53 位值的 double,则不会有问题。

简而言之,避免使用浮点数,除非你有充分的理由使用它。

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
于 2013-01-04T08:14:06.650 回答
1

在 java 中,

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