从可能的 null Double 创建的 BigDecimal 的总和

Sum of BigDecimal(s) created from possible null Double

为了避免在 Java 对 Double 对象的操作中可能出现的精度损失,即:

Double totalDouble = new Double(1590.0);
Double taxesDouble = new Double(141.11);
Double totalwithTaxes = Double.sum(totalDouble,taxesDouble);
//KO: 1731.1100000000001
System.out.println(totalwithTaxes); // 1731.1100000000001

我写了这段代码,其中 totalDoubletaxesDouble 也可以是 null:

Double totalDouble = myObject.getTotalDouble();
Double taxesDouble = myObject.getTaxesDouble();
BigDecimal totalBigDecimalNotNull = (totalDouble==null) ? BigDecimal.valueOf(0d):BigDecimal.valueOf(totalDouble);
BigDecimal taxesBigDecimalNotNull = (taxesDouble==null) ? BigDecimal.valueOf(0d):BigDecimal.valueOf(taxesDouble);
BigDecimal totalWithTaxesBigDecimal = totalBigDecimalNotNull.add(taxesBigDecimalNotNull);
System.out.println(totalWithTaxesBigDecimal);

在这种情况下,是否有更好的方法(还有第三方库,即番石榴等)来初始化 BigDecimal(如果 Doublenull 和 [=12=,则为零] 否则值)?

不是真的。也就是说,您仍然需要根据值是否为 null 来做出决定,但是如果您使用 Optional 模式,您可以做得更干净。

您可以将 getTotalDoublegetTaxesDouble return 更改为 Optional<Double> 而不是 mititgate 必须执行三元...

public Optional<Double> getTotalDouble() {
   return Optional.ofNullable(totalDouble);
}

public Optional<Double> getTaxesDouble() {
   return Optional.ofNullable(taxesDouble);
}

...然后,您可以使用Optional本身提供的条件评估来评估和return一个默认值。

BigDecimal totalBigDecimalNotNull =
           BigDecimal.valueOf(myObject.getTotalDouble().orElse(0d));

一种简化方法是 return Optional<BigDecimal>,而不是以这种方式转换您想要的值。

作为附录,在谈论精度时要小心。 There is standing advice 改为使用 intlong 以确保您不会丢失任何硬币精度。

无论您是否使用 Optional,我都建议您创建一个静态辅助方法,这样您就不必自己重复了。例如:

public static BigDecimal bigDecimalValueOfOrZero(Double val) {
    return val == null ? BigDecimal.ZERO : BigDecimal.valueOf(val);
}