是否有一个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);
}
答案 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);
}