BigDecimal的java数学库,允许空值

时间:2013-02-12 00:55:53

标签: java bigdecimal

是否有一个BigDecimal库,其中包含允许空值的BigDecimal基本操作?

出于数学目的,应将Null视为0。

我不想对可能的空值进行所有空检查。

您永远不会在数据库,应用程序或视图中允许空值,并使用new BigDecimal(0)初始化所有内容,或对可空值的每次使用执行空检查。

类似的东西:

public static BigDecimal add(final BigDecimal value, final BigDecimal augend)
{
    if (value == null)
        return augend;
    else if (augend == null)
        return value;
    else
        return value.add(augend);
}

public static BigDecimal multiply(final BigDecimal value, final BigDecimal multiplicand)
{
    if (value == null || multiplicand == null)
        return null;

    return value.multiply(multiplicand);
}

4 个答案:

答案 0 :(得分:16)

保存编码,只是不允许数据库中的空值。使默认值为零。

至于new BigDecimal(0):不,请使用BigDecimal.ZERO

答案 1 :(得分:10)

我遇到了类似的问题(与数据库无关,只需要总结一些可能为空的BigDecimals)。没有找到任何库,所以不得不自己编写以下函数:

public static BigDecimal add(BigDecimal... addends) {
    BigDecimal sum = BigDecimal.ZERO;
    if (addends != null) {
        for (BigDecimal addend : addends) {
            if (addend == null) {
                addend = BigDecimal.ZERO;
            }
            sum = sum.add(addend);
        }
    }
    return sum;
}

Java 8中的相同内容:

public static BigDecimal add(BigDecimal... addends) {
    if (addends == null) {
        return BigDecimal.ZERO;
    }
    return Arrays.stream(addends)
            .filter(Objects::nonNull)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}

答案 2 :(得分:5)

我想我没有看到库检查null的意义。当然,图书馆不会抛出NPE,但调用者最终将不得不检查它。您上面的乘客会打电话的是什么?它不能只使用输出。在它可以对值做任何事情之前,它必须检查返回的值是否在某个时刻为空。

此外,对于我曾经写过的任何应用程序,null与零有很大不同。我不想使用将null视为零的那个。

如果您的要求是数据库中不允许空值,我会在写入数据库之前检查DAO层中的空值。

答案 3 :(得分:0)

如果列表包含空元素,它不等于空... 所以这是一个单元测试,用于测试所有案例及其实现:

    @ParameterizedTest
    @MethodSource("shouldSumBigDecimalsParams")
    void shouldSumBigDecimals(BigDecimal expectedSum, BigDecimal first, BigDecimal second) {
        BigDecimal sum = bigDecimalsSum(first, second);
        assertThat(sum).isEqualTo(expectedSum);
    }

    private static Stream<Arguments> shouldSumBigDecimalsParams() {
        return Stream.of(
            Arguments.of(new BigDecimal("1010"), new BigDecimal("1000"), BigDecimal.TEN),
            Arguments.of(new BigDecimal("1000"), new BigDecimal("1000"), null),
            Arguments.of(BigDecimal.TEN, null, BigDecimal.TEN),
            Arguments.of(BigDecimal.ZERO, null, BigDecimal.ZERO),
            Arguments.of(BigDecimal.ZERO, BigDecimal.ZERO, null),
            Arguments.of(BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO),
            Arguments.of(null, null, null)
        );
    }

实现:

static BigDecimal bigDecimalsSum(BigDecimal... bigdecimals) {
    if (Arrays.stream(bigdecimals).allMatch(Objects::isNull)) {
        return null;
    }
    return Arrays.stream(bigdecimals)
            .filter(Objects::nonNull)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}