当前位置: 首页 > 知识库问答 >
问题:

如何添加任意一组Java Number对象,以获得最准确的结果?

葛鸿轩
2023-03-14

我必须编写一个SUM()方法,它可以获得Number对象数组(Java)。所以它可能是几个短对象,然后是几个浮点,然后是一个bigdecimal。

如果所有内容都是byte/short/integer/long,那么返回的值应该是long。

目前,我收集了long(全部byte/short/integer/long)、double(全部float/double)和bigdecimal的运行总数。然后在最后添加到任何一个已经被使用(我有2个布尔跟踪),并返回。

它很管用,但不干净。有更简单的方法吗?添加两个Number对象并返回适当的Number对象的方法?

共有1个答案

臧增
2023-03-14

没有很好的方法来做到这一点,但您可以将其分解成许多更小、更简单的方法。我的方法是建立类型的层次结构。理想情况下,添加只涉及级别较低的类型。一旦确定了要进行加法的适当级别,就可以调用适当的方法。以下是我的代码(未测试)。

private static final Map<Class<? extends Number>, Integer> RANKS;

static {
    Map<Class<? extends Number>, Integer> map = new IdentityHashMap<>();
    map.put(Byte.class, 0);
    map.put(Short.class, 1);
    map.put(Integer.class, 2);
    map.put(Long.class, 3);
    map.put(BigInteger.class, 4);
    map.put(Float.class, 5);
    map.put(Double.class, 6);
    map.put(BigDecimal.class, 7);
    RANKS = Collections.unmodifiableMap(map);
}

private static Number addBytes(Number... numbers) {
    byte a = 0;
    for (Number number : numbers)
        a += number.byteValue();
    return a;
}

private static Number addShorts(Number... numbers) {
    short a = 0;
    for (Number number : numbers)
        a += number.shortValue();
    return a;
}

private static Number addInts(Number... numbers) {
    int a = 0;
    for (Number number : numbers)
        a += number.intValue();
    return a;
}

private static Number addLongs(Number... numbers) {
    long a = 0;
    for (Number number : numbers)
        a += number.longValue();
    return a;
}

private static Number addBigIntegers(Number... numbers) {
    BigInteger a = BigInteger.ZERO;
    for (Number number : numbers)
        a = a.add(number instanceof BigInteger ? (BigInteger) number : BigInteger.valueOf(number.longValue()));
    return a;
}

private static Number addFloats(Number... numbers) {
    float a = 0;
    for (Number number : numbers)
        a += number.floatValue();
    return a;
}

private static Number addDoubles(Number... numbers) {
    double a = 0;
    for (Number number : numbers)
        a += number.doubleValue();
    return a;
}

private static Number addBigDecimals(Number... numbers) {
    BigDecimal a = BigDecimal.ZERO;
    for (Number number : numbers) {
        a = a.add(
                number instanceof BigDecimal ? (BigDecimal) number
                        : number instanceof BigInteger ? new BigDecimal((BigInteger) number)
                        : new BigDecimal(number.doubleValue()));
    }
    return a;
}

public static Number add(Number... numbers) {
    if (numbers.length == 0)
        return 0;
    int max = -1;
    for (Number number : numbers) {
        Integer rank = RANKS.get(number.getClass());
        if (rank == null)
            throw new IllegalArgumentException();
        max = Math.max(max, rank);
    }
    switch (max) {
        case 0: return addBytes(numbers);
        case 1: return addShorts(numbers);
        case 2: return addInts(numbers);
        case 3: return addLongs(numbers);
        case 4: return addBigIntegers(numbers);
        case 5: return addFloats(numbers);
        case 6: return addDoubles(numbers);
        case 7: return addBigDecimals(numbers);
        default: throw new IllegalStateException();
    }
}
 类似资料:
  • 我正在构建/训练Tesseract从捕获的照片中识别护照MRZ代码。在将照片/图像发送到Tesseract引擎之前,我将应用以下图像预处理技术: 二值化 正常化 取样 去噪 细化(可选) 此外,我已经用正确的字体(OCR-B)训练了Tesseract引擎,方法是创建大量的框文件(来自大约35个示例,其中包含从OCR-B字体的文本示例中获取的照片),修复框文件中的任何错误,创建训练文件,最后用我的所

  • 问题内容: 我已经多次重温了这个问题,但我从未真正找到合适的答案。 是否可以执行MySQL搜索,以按相关性返回ACTUAL准确排序的结果? 我试图创建一个ajax搜索表单,当用户在输入字段中键入内容时提出建议,并且仅使用纯MySQL查询还没有找到合适的解决方案。我知道有可用的搜索服务器,例如ElasticSearch,我想知道如何仅使用原始MySQL查询来实现。 我有一张学校科目表。少于1200行

  • 问题内容: 我有问题,请查看我的数据库: 我想收到这样的信息(按投票顺序,从最高到最低): 您能帮我写正确的SQL查询吗? 问题答案:

  • 问题内容: 我创建了一个过滤器来监视请求的长度。 我现在如何获得毫秒数? 问题答案: 1微秒= 1000纳秒 1毫秒= 1000微秒 请注意,结果会四舍五入,但是无论如何您通常都无法获得真正的纳秒精度(准确性取决于操作系统)。从Javadoc开始: 此方法提供纳秒精度,但不一定提供纳秒精度。

  • 我有一个对象的数组,正在寻找使用es6根据material_id对它们进行分组的最有效的方法 所以最后我想得到 我已经检查了这个问题,但它似乎没有显示出分组

  • 问题内容: 如何将对象添加到数组(使用javascript或jquery)?例如,此代码有什么问题? 我想使用此代码在function1数组中保存许多对象,并调用function2在数组中使用该对象。 如何将对象保存在数组中? 如何将对象放入数组并将其保存到变量? 问题答案: 使用Array.push()将任何东西放入数组。 有关数组的更多信息 一次添加多个项目 将项目添加到数组的开头 将一个数组