私の質問は、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;
私の質問は、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;
問題は、float
の仮数のビット数が少なすぎて 1615021049 を正確に表現できないことです。後者は 31 ビットを必要とし、前者は 23 ビットしか提供しません。したがって、精度が失われます。
aには 1615021049 を表すのに十分な 52 ビットの仮数部がdoubles
あるため、これは問題ではありません。double
ウィキペディアを参照してください。
実数は無限にあります。float には 32 ビットしかありません。したがって、すべての実数を float として正確に表現できるわけではないことは明らかです。また、float 表現により、小さな数値が大きな数値よりも正確になります。
int
値を格納するための 31 ビット (プラス記号) がありますが、float
24 ビット (プラス指数と記号) しかありません。
これは、一部の大きな値をエラーなしで表すことができないことを意味します。値が 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