根据Number.longValue()
方法的规范应...
以 long 形式返回指定数字的值。这可能涉及舍入或截断。
但是,BigInteger
(and BigDecimal
) 会覆盖此方法并返回它所代表的数字的整数部分的低 64 位。从BigInteger
例如的文档:
[...]如果这个 BigInteger 太大而无法放入 long 中,则只返回低 64 位。[...]
我声称“这可能涉及舍入或截断。 ”没有说明该方法实际应该返回什么,或者在实现或文档中存在错误。
你会同意,还是我的推理有误?
示例代码:
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