26

是否有具有 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

4 回答 4

23

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

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

于 2013-02-12T01:11:52.847 回答
20

我有一个类似的问题(虽然与数据库无关,只需要总结几个 nullable 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);
}
于 2015-03-20T14:19:54.297 回答
6

我想我没有看到库检查 null 的意义。当然,库不会抛出 NPE,但调用者最终将不得不检查它。您的上述乘法的调用者会做什么?它不能只使用输出。它必须先检查返回的值是否在某个时刻为空,然后才能对该值执行任何操作。

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

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

于 2013-02-12T01:10:03.580 回答
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);
}
于 2021-04-07T10:35:11.387 回答