4

私の質問は、Java での変換に関するものです。私は整数 1615021049 を持っています。それを 1 で割ると (これも float です)、float で得られる答えは 1.61502106E9 で、整数に戻すと元の数値ではない 1615021056 になります。親切に助けてください。変数 m と b を double に変換すると、同じことが正しく機能します。

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

4 に答える 4

5

問題は、floatの仮数のビット数が少なすぎて 1615021049 を正確に表現できないことです。後者は 31 ビットを必要とし、前者は 23 ビットしか提供しません。したがって、精度が失われます。

aには 1615021049 を表すのに十分な 52 ビットの仮数部がdoublesあるため、これは問題ではありません。double

ウィキペディアを参照してください。

于 2013-01-04T08:07:48.360 に答える
3

実数は無限にあります。float には 32 ビットしかありません。したがって、すべての実数を float として正確に表現できるわけではないことは明らかです。また、float 表現により、小さな数値が大きな数値よりも正確になります。

于 2013-01-04T08:08:14.430 に答える
2

int値を格納するための 31 ビット (プラス記号) がありますが、float24 ビット (プラス指数と記号) しかありません。

これは、一部の大きな値をエラーなしで表すことができないことを意味します。値が 53 ビットの double を使用する場合、問題はありません。

つまり、float を使用する非常に正当な理由がない限り、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
于 2013-01-04T08:14:06.650 に答える