Number.longValue()
メソッドの仕様によると...
指定された数値の値を long として返します。これには、丸めまたは切り捨てが含まれる場合があります。
ただし、BigInteger
(and BigDecimal
) はこのメソッドをオーバーライドし、それが表す数値の整数部分の下位 64 ビットを返します。BigInteger
たとえば、ドキュメントから:
[...]この BigInteger が大きすぎて long に収まらない場合、下位 64 ビットのみが返されます。[...]
「This may include rounding or truncation. 」は、メソッドが実際に何を返す必要があるかについて何も述べていないか、実装またはドキュメントにバグがあると主張します。
あなたは同意しますか、それとも私の推論に誤りがありますか?
コード例:
import java.math.BigInteger;
import static java.math.BigInteger.*;
public class Main {
public static void main(String[] args) {
BigInteger i = valueOf(Long.MAX_VALUE);
// Result: Long.MAX_VALUE, just as expected.
Number n1 = i;
System.out.println(n1 + " -> " + n1.longValue());
// I expect to get the "rounded" value Long.MAX_VALUE
Number n2 = i.add(ONE);
System.out.println(n2 + " -> " + n2.longValue());
// I expect to get the "rounded" value Long.MAX_VALUE
Number n3 = i.multiply(TEN);
System.out.println(n3 + " -> " + n3.longValue());
}
}
出力:
9223372036854775807 -> 9223372036854775807
9223372036854775808 -> -9223372036854775808
92233720368547758070 -> -10