2

long は 64 ビットの符号付き 2 の補数整数です。Long は 128 ビットの符号付き 2 の補数整数ですか? 続行する前にこれを確認したかっただけです。

Long l = 6;
int i = 4;
Integer ii = 2;
l += (l/i) * ii;

2 ではなく 3 を返すには、どこで型キャストする必要があるのだろうと思っていました。

私は次のことを試しました:

l += (long) (((double) l/i) * ii);

で型キャストl/iすると、 ? ではなく がdouble返されます。11.5

Long を型キャストするとしましょう。これは Long の最大数であり、(long) を使用すると、long は 64 ビットの符号付き 2 の補数の整数であるため、どうなるでしょうか。

4

3 に答える 3

4

long(小文字) はプリミティブ型の 64 ビット整数です。Long(大文字) はlong(小文字) をラップする参照型 (オブジェクト) です。したがってLong、 はデータを a にエンコードするlongため、64 ビットでもあります。> 64 ビットの精度が必要な場合は、任意の高精度を提供するjava.math.BigIntegerを調べてください。

あなたの問題は、除算ステートメント内の誤ったキャストからlongではなく、最後のキャストから発生します。

l += (long) (((double) l/i) * ii);
       ^
       here

の結果は(((double) l/i) * ii)double3.0 です。浮動小数点演算の特性により、これを a にキャストすると 2 になりlongます。

これを解決するMath.roundには、型キャストの代わりに使用します。

 l += Math.round(((double) l/i) * ii);
于 2013-04-06T05:48:20.423 に答える
0

あなたの(l/i) * ii意味は力ですか?もしそうなら、多分あなたは使うべきBigDecimalです。ところで、1/i0 に等しいです。代わりに使用1.0/iします。

于 2013-04-06T05:53:56.530 に答える
0

Longlongは、プリミティブ オブジェクトに関連するコンストラクタ、メソッド、および定数を含むクラスです(たとえばLong.MAX_VALUE、 a が表すことができる最大値が得られますlong)。alongを aLongに変換すると、値型から参照型に変換されます。値を表すために使用されるビット数は変わりません。

于 2013-04-06T05:57:55.283 に答える