2

根据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
4

3 回答 3

4

的文档BigInteger.longValue()继续:

请注意,此转换可能会丢失有关 BigInteger 值的整体大小的信息,并返回带有相反符号的结果

这重新定义(或澄清)由Number.longValue(). 这很好,尽管有时会产生误导。例如java.util.Set重新定义方法的行为add(通过约束重复)。如果您传递 aCollection您可能希望它保存任何值,但具体实现已经重新定义了这种行为。

更新:我检查了Long.valueOf(Long.MAX_VALUE).intValue()行为方式。它打印-1。因此,关于浮点数,我认为“舍入或截断”只是一种可能性。否则,Number该类将转换方式完全留给实现者。所以是的 - 它没有说明任何事情。我不会说它有那么糟糕,但它肯定会产生误导。

于 2010-11-17T12:16:37.577 回答
2

我没有看到您的问题,这与您尝试表示特定数字类型范围之外的数字时得到的垃圾有什么不同?

final Number n = Long.MAX_VALUE;
System.out.println(n + " -> " + n.intValue());

印刷

9223372036854775807 -> -1

您是否希望 API 告诉您,如果您传递无效输入,您将获得无效输出?

于 2010-11-17T12:18:30.777 回答
1

措辞“这可能涉及舍入或截断”出现在、和of的 javadoc 中longValue(),因此很明显“截断”旨在包括在某些情况下丢失重要的高位位。shortValue()charValue()byteValue()Number

问题实际上是术语“截断”通常意味着丢失低阶位。(这就是我在 30 年前的数值分析课程中记忆的方式。维基百科也同意。)

相比之下,JLS 5.1.3描述了相同的过程(在缩小整数原始类型时),如下所示:

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。

所以是的,我同意 javadoc 是不正确的。提交错误报告。

笔记

我最初删除了这个,因为我认为我提交错误报告的建议可能是徒劳的(基于我过去对文档错误报告的经验)。但是@aioobe已经提交了一个错误报告......(错误 ID:7000825

于 2010-11-17T13:37:49.177 回答