BigDecimalクラスのintValue()を使用して、奇妙なJavaバグを実行しています。BigDecimal.intValue()は予期しない数値を返します
int i = d.intValue();
それが返されます:-994939296
任意のIDEを、これが起こる理由として
私は
私は、次のコードを呼び出す3300028000.の値から始まるんですか?
BigDecimalクラスのintValue()を使用して、奇妙なJavaバグを実行しています。BigDecimal.intValue()は予期しない数値を返します
int i = d.intValue();
それが返されます:-994939296
任意のIDEを、これが起こる理由として
私は
私は、次のコードを呼び出す3300028000.の値から始まるんですか?
この数値をint変数に収めると、Javaのint型が32ビットであるため、オーバーフローします。int変数は、-2,147,483,648から2,147,483,647までの値を格納できます。
BigIntegerの値を保存するには、長い変数を使用する必要があります。これを試してみてください:
long value = d.longValue();
intは大きな値を保持できないため、オーバーフローします。長く使ってみてください。
あなたが本当にそれを非難する前にJava APIをお読みください:
がこのBigDecimalをintに変換します。この変換は、 に類似しています。Java™言語仕様の セクション5.1.3で定義されているように、doubleからshortへの縮小プリミティブ変換です。このBigDecimalの小数部分 は破棄され、結果として "BigInteger" intに収まるように大きければ、下位32ビット のみが返されます。この変換によって、このBigDecimal値の 全体の大きさと精度に関する情報が失われ、 の結果と反対の符号が返されることに注意してください。
何を返すといいですか? :) javadocsで説明したように
:得られた "のBigIntegerは" INTに収まるには大きすぎる場合
intValueExact、唯一 下位32ビットは、
に戻され一方、例外をスローします。
なぜBigDecimalのint値が必要なのか分かりませんが、BigDecimalクラスにはリクエストに合わせたたくさんのメソッドが含まれています。
compareTo
add
substract
multiply
divide
など。
私はBigDecimalを自分自身で動作します。遅かれ早かれ。 BigDecimal型を他のプリミティブ型に変換すると、エラーが発生します。それらのすべてには限界があります。
'longValue'は同じ問題を引き起こす可能性があります。参考までに、オーバーフローが発生する前に大きな値が必要です。 –
正しい。長い変数に値を格納するには、64ビットを超えないようにする必要があります。 BigIntegerの値が64ビットより大きい場合は、それをBigValueオブジェクトに保持する必要があります。 –
「BigValue」とは何ですか? –